亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server 行列相互轉換命令:PIVOT和UNPIVOT使用詳解

2024-08-31 00:56:03
字體:
來源:轉載
供稿:網友

一、使用PIVOT和UNPIVOT命令的SQL Server版本要求

1.數據庫的最低版本要求為SQL Server 2005 或更高。

2.必須將數據庫的兼容級別設置為90 或更高。

3.查看我的數據庫版本及兼容級別。

如果不知道怎么看數據庫版本或兼容級別的話可以在SQL Server Management Studio新建一個查詢窗口輸入:PRint @@version,運行之后在我的本機上得到:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86)

Apr  2 2010 15:53:02

Copyright (c) Microsoft Corporation

Express Edition with Advanced Services on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)

然后我們選擇一個數據庫然后右鍵-屬性 選擇[選項]得到下圖的信息。

T-SQL行列相互轉換命令:PIVOT和UNPIVOT使用詳解 

在確認數據庫的版本和兼容級別符合1,2點的要求后你才可以接著繼續往下學習。

二、使用PIVOT 實現數據表的列轉行

1.在這里我們先構建一個測試數據表(這里使用的是臨時表,以方便我們在退出會話的時候自動刪除表及其數據)

首先我們先設計一個表架構為#Student { 學生編號[PK],  姓名, 性別, 所屬班級 }的表,然后編寫如下T-SQL

--創建臨時表(僅演示,表結構的不合理還請包涵)

CREATE TABLE #Student ([學生編號] INT IDENTITY(1, 1) PRIMARY KEY, [姓名] NVARCHAR(20), [性別] NVARCHAR(1), [所屬班級] NVARCHAR(20))

--給臨時表插入數據

INSERT INTO #Student ([姓名], [性別], [所屬班級]) SELECT '李妹妹', '女', '初一 1班' UNION ALL SELECT '泰強', '男', '初一 1班' UNION ALL SELECT '泰映', '男', '初一 1班' UNION ALL SELECT '何謝', '男', '初一 1班' UNION ALL SELECT '李春', '男', '初二 1班' UNION ALL SELECT '吳歌', '男', '初二 1班' UNION ALL SELECT '林純', '男', '初二 1班' UNION ALL SELECT '徐葉', '女', '初二 1班' UNION ALL SELECT '龍門', '男', '初三 1班' UNION ALL SELECT '小紅', '女', '初三 1班' UNION ALL SELECT '小李', '男', '初三 1班' UNION ALL SELECT '小黃', '女', '初三 2班' UNION ALL SELECT '旺財', '男', '初三 2班' UNION ALL SELECT '強強', '男', '初二 1班';以下是查詢的結果:

2.查詢各班級的總人數

SELECT [所屬班級] AS [班級], COUNT(1) AS [人數] FROM #Student GROUP BY [所屬班級] ORDER BY [人數] DESC
班級       人數-------- -----------初二 1班    5初一 1班    4初三 1班    3初三 2班    2

好了,在這里我希望把上面的表{ 班級, 人數 } 由 班級[行] 的顯示轉換為 班級[列] 的顯示格式!

在此你會看到第一個PIVOT示例。是否很期待??

3.編寫第一個PIVOT示例

SELECT '班級總人數:' AS [總人數], [初一 1班], [初一 2班], [初二 1班], [初三 1班], [初三 2班] FROM (	SELECT [所屬班級] AS [班級], [姓名] FROM #Student) AS [SourceTable] 	PIVOT (COUNT([姓名]) FOR [班級] IN ([初一 1班], [初一 2班], [初二 1班], [初三 1班], [初三 2班]) ) AS [PivotTable]總人數         初一 1班       初一 2班       初二 1班       初三 1班       初三 2班----------- ----------- ----------- ----------- ----------- -----------班級總人數:      4           0           5           3           2在結果表中我們看到了對于不存在的班級初一2班它的總人數為0,這符合我們預期的結果!

解釋:使用POVIT首先你需要在FROM子句內定義2個表:

A.一個稱為源表(SourceTable)。

B.另一個稱為數據透視表(PivotTable)。

語法:

SELECT <未透視的列>, [第一個透視列] AS <列別名>, [第二個透視列] AS <列別名>, ... [最后一個透視列] AS <列別名> FROM (<SELECT查詢>) AS <源表> PIVOT (<聚合函數>(<列>) FOR [<需要轉換為行的列>] IN ([第一個透視列], [第二個透視列],... [最后一個透視列])) AS <數據透視表> <可選的ORDER BY子句>;

以上的PIVOT子句內的第1…n個透視列的值均為需要轉換為行的列的常量值,需要用[]括起,支持GUID,字符串及各種數字!

4.下面演示一個較為高級的行轉列的應用示例

--使用PIVOT查詢班級內的男女學生人數及總人數

SELECT [所屬班級] AS [班級], [男] AS [男生人數], [女] AS [女生人數], [男] + [女] AS [總人數] FROM (	SELECT [姓名], [所屬班級], [性別] FROM #Student) AS [SourceTable] 	PIVOT (COUNT([姓名]) FOR [性別] IN ([男], [女])) AS [PivotTable] 	ORDER BY [總人數] DESC班級       男生人數        女生人數        總人數-------- ----------- ----------- -----------初二 1班    4           1           5初一 1班    3           1           4初三 1班    2           1           3初三 2班    1           1           2

三、使用UNPIVOT 實現的功能其實與PIVOT恰恰相反

1.語法同PIVOT但是UNPIVOT的子句沒有聚合函數

SELECT   <未逆透視的列>,   [合并后的列] AS <列別名>,   [行值的列名] AS <列別名>  FROM (   <SELECT查詢>  ) AS <源表>  UNPIVOT (   <行值的列名>  FOR <將原來多個列合并到單個列的列名> IN (   [第一個合并列], [第二個合并列],   ...   [最后一個合并列]   )   ) AS <數據逆透視表>  <可選的ORDER BY子句>; 

2.看上面的語法感覺很浮云,不怕,這里帶例子(繼續使用II中用到的PIVOT表)

--源表

SELECT   '班級總人數:' AS [總人數],   [初一 1班], [初一 2班],   [初二 1班],   [初三 1班], [初三 2班]   INTO #PivotTable --為了使表達意圖更清晰,我把PIVOT處理后的表放到一個臨時表當中   FROM (   SELECT   [所屬班級] AS [班級],   [學生編號]   FROM #Student   ) AS [SourceTable]   PIVOT (   COUNT([學生編號])   FOR [班級] IN (   [初一 1班], [初一 2班],   [初二 1班],   [初三 1班], [初三 2班]   )   ) AS [PivotTable] 

T-SQL行列相互轉換命令:PIVOT和UNPIVOT使用詳解

將多個列合并到單個列的轉換的語句!!!

--結果

SELECT   [班級], [總人數]   FROM (   SELECT   [初一 1班], [初一 2班],   [初二 1班],   [初三 1班], [初三 2班]   FROM   #PivotTable   ) AS [s]   UNPIVOT (   [總人數]   FOR [班級] IN (   [初一 1班], [初一 2班],   [初二 1班],   [初三 1班], [初三 2班]   )   ) AS [un_p] 

T-SQL行列相互轉換命令:PIVOT和UNPIVOT使用詳解 

執行下面代碼:

SELECT   [所屬班級] AS [班級],   [男] AS [男生人數],   [女] AS [女生人數],   [男] + [女] AS [總人數]   INTO #PivotTable2 --放到臨時表方便查詢   FROM (   SELECT [學生編號], [所屬班級], [性別] FROM #Student   ) AS [SourceTable]   PIVOT (   COUNT([學生編號])   FOR [性別] IN (   [男], [女]   )   ) AS [PivotTable]   ORDER BY [總人數] DESC   SELECT   [班級],   [男生或女生人數],   [性別],   [總人數]   FROM (   SELECT [班級], [男生人數], [女生人數], [總人數] FROM #PivotTable2   ) AS [s]   UNPIVOT (   [男生或女生人數]   FOR [性別] IN (   [男生人數],   [女生人數]   )   ) AS [un_p] 

T-SQL行列相互轉換命令:PIVOTH和UNPIVOT使用詳解

或者將性別和人數合并到一個列當中:

SELECT   [班級],   [性別] + ': ' + CAST([男生或女生人數] AS NVARCHAR(1)) AS [男生或女生人數],   [總人數]   FROM (   SELECT [班級], [男生人數], [女生人數], [總人數] FROM #PivotTable2   ) AS [s]   UNPIVOT (   [男生或女生人數]   FOR [性別] IN (   [男生人數],   [女生人數]   )   ) AS [un_p] 

T-SQL行列相互轉換命令:PIVOT和UNPIVOT使用詳解


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品福利视频导航| 欧美在线观看视频| 色先锋久久影院av| 日韩小视频网址| 国产精品日韩欧美综合| 亚洲欧美在线免费观看| 91人人爽人人爽人人精88v| 国产精品自拍偷拍| 欧美一级视频一区二区| 欧美精品在线免费| 国产成人av在线播放| 欧美日韩国产精品一区| 九九久久国产精品| 91精品综合久久久久久五月天| 国产精品久久久久久久7电影| 在线观看国产欧美| 97久久久久久| 超在线视频97| 久久精品2019中文字幕| 法国裸体一区二区| 日韩精品在线免费观看视频| 日韩精品久久久久久福利| 国产亚洲精品久久久优势| 国产精品免费视频xxxx| 8090理伦午夜在线电影| 色悠悠久久88| 亚洲国产成人在线视频| 亚洲精品国产精品国产自| 日韩亚洲一区二区| 久久视频国产精品免费视频在线| 日韩欧美国产视频| 欧美大片免费观看在线观看网站推荐| 欧美wwwwww| 久久久这里只有精品视频| xxav国产精品美女主播| 国产日韩欧美在线视频观看| 国产视频在线一区二区| 国产精品久久久久久久7电影| 日韩精品视频中文在线观看| 亚洲国产日韩精品在线| 欧美精品一区二区三区国产精品| 久久免费精品日本久久中文字幕| 午夜精品在线观看| 亚洲成人在线视频播放| 欧美高清一级大片| 亚洲国产精品美女| 欧美成人一区二区三区电影| 日韩亚洲欧美中文在线| 久久久噜噜噜久久久| 亚洲无亚洲人成网站77777| 日韩福利视频在线观看| 久久精品视频网站| 午夜欧美大片免费观看| 亚洲黄在线观看| 日本高清不卡的在线| 成人免费观看49www在线观看| 国产在线观看不卡| 欧美成人免费全部观看天天性色| 丝袜情趣国产精品| www.精品av.com| 欧美激情亚洲自拍| 日韩视频免费看| 国产精品亚洲一区二区三区| 欧美裸体xxxxx| 亚洲美女性生活视频| 国产精品免费视频久久久| 久久国产精品久久精品| 日韩成人久久久| 国产999视频| 久久视频国产精品免费视频在线| 日韩av资源在线播放| 久久久免费在线观看| 欧美xxxx做受欧美.88| 韩国日本不卡在线| 美女扒开尿口让男人操亚洲视频网站| 欧美激情久久久久久| 欧美xxxx做受欧美| 欧美孕妇孕交黑巨大网站| 日韩麻豆第一页| 欧美福利在线观看| 国产xxx69麻豆国语对白| 欧美剧在线观看| 亚洲xxxx做受欧美| 激情av一区二区| 欧美成人黑人xx视频免费观看| 亚洲女人天堂成人av在线| 国模精品一区二区三区色天香| 91精品视频在线看| 国产美女91呻吟求| 黄色精品一区二区| 欧美成人黑人xx视频免费观看| 精品视频中文字幕| 亚洲视频在线观看视频| 久久久精品国产| 全色精品综合影院| 91精品国产综合久久香蕉922| 色天天综合狠狠色| 精品免费在线观看| 日日骚久久av| 日韩欧美国产骚| 亚洲一级片在线看| 国产日韩欧美夫妻视频在线观看| 91最新在线免费观看| 51精品在线观看| 成人a免费视频| 亚洲激情 国产| 成人国产精品日本在线| 97人人模人人爽人人喊中文字| 欧美激情精品久久久久| 国产成人在线一区二区| 久久精品视频中文字幕| 综合激情国产一区| 美女少妇精品视频| 国产精品一区二区三区免费视频| 欧美日韩福利视频| 国产啪精品视频网站| 精品小视频在线| 美女视频黄免费的亚洲男人天堂| 日韩视频免费观看| 日本精品一区二区三区在线播放视频| 国产精品十八以下禁看| 97成人在线视频| 欧美成人午夜激情视频| 亚洲国产精品99久久| 欧美孕妇毛茸茸xxxx| 久久亚洲精品一区二区| 岛国av在线不卡| 亚洲激情视频网站| 久久精品视频在线观看| 国产精品精品久久久| 国产亚洲一区二区精品| 最近更新的2019中文字幕| 亚洲一区二区三区香蕉| 国产91成人video| 最近的2019中文字幕免费一页| 国产精品视频久久久久| 欧美一级视频在线观看| 国产日本欧美在线观看| 国产玖玖精品视频| 亚洲第一页中文字幕| 在线日韩精品视频| 精品成人69xx.xyz| 精品中文字幕久久久久久| 国产视频久久久久| 亚洲精品免费网站| 亚洲色图校园春色| 91av在线国产| 视频在线观看一区二区| 日韩精品极品毛片系列视频| 色悠悠国产精品| 全亚洲最色的网站在线观看| 欧美国产日韩一区二区在线观看| 精品伊人久久97| www.亚洲一区| 国产伦精品一区二区三区精品视频| 久久精品国产一区| 亚洲国产欧美一区二区三区久久| 亚洲成人av在线| 久久久久久久久久av| 国产精品久久久久久久久免费| 精品视频在线导航| 欧美在线不卡区| 欧美成人午夜免费视在线看片| 亚洲精品成人av|