日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
T-SQL行列相互轉換命令:PIVOT和UNPIVOT使用詳解

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

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供豐縣網(wǎng)站建設、豐縣做網(wǎng)站、豐縣網(wǎng)站設計、豐縣網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、豐縣企業(yè)網(wǎng)站模板建站服務,十余年豐縣做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

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

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

3.查看我的數(shù)據(jù)庫版本及兼容級別。

如果不知道怎么看數(shù)據(jù)庫版本或兼容級別的話可以在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 (Build 3790: Service Pack 2)

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

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

二、使用PIVOT 實現(xiàn)數(shù)據(jù)表的列轉行

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

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

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

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

--給臨時表插入數(shù)據(jù)

 
 
 
 
  1. INSERT INTO #Student (
  2. [姓名], [性別], [所屬班級]
  3. )
  4. SELECT '李妹妹', '女', '初一 1班' UNION ALL
  5. SELECT '泰強', '男', '初一 1班' UNION ALL
  6. SELECT '泰映', '男', '初一 1班' UNION ALL
  7. SELECT '何謝', '男', '初一 1班' UNION ALL
  8. SELECT '李春', '男', '初二 1班' UNION ALL
  9. SELECT '吳歌', '男', '初二 1班' UNION ALL
  10. SELECT '林純', '男', '初二 1班' UNION ALL
  11. SELECT '徐葉', '女', '初二 1班' UNION ALL
  12. SELECT '龍門', '男', '初三 1班' UNION ALL
  13. SELECT '小紅', '女', '初三 1班' UNION ALL
  14. SELECT '小李', '男', '初三 1班' UNION ALL
  15. SELECT '小黃', '女', '初三 2班' UNION ALL
  16. SELECT '旺財', '男', '初三 2班' UNION ALL
  17. SELECT '強強', '男', '初二 1班';

以下是查詢的結果:

學生編號

姓名

性別

所屬班級

1

李妹妹

初一 1班

2

泰強

初一 1班

3

泰映

初一 1班

4

何謝

初一 1班

5

李春

初二 1班

6

吳歌

初二 1班

7

林純

初二 1班

8

徐葉

初二 1班

9

龍門

初三 1班

10

小紅

初三 1班

11

小李

初三 1班

12

小黃

初三 2班

13

旺財

初三 2班

14

強強

初二 1班

2.查詢各班級的總人數(shù)

 
 
 
 
  1. SELECT
  2. [所屬班級] AS [班級],
  3. COUNT(1) AS [人數(shù)]
  4. FROM #Student
  5. GROUP BY [所屬班級]
  6. ORDER BY [人數(shù)] DESC

班級

人數(shù)

初二 1班

5

初一 1班

4

初三 1班

3

初三 2班

2

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

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

3.編寫第一個PIVOT示例

 
 
 
 
  1. SELECT
  2. '班級總人數(shù):' AS [總人數(shù)],
  3. [初一 1班], [初一 2班],
  4. [初二 1班],
  5. [初三 1班], [初三 2班]
  6. FROM (
  7. SELECT
  8. [所屬班級] AS [班級],
  9. [學生編號]
  10. FROM #Student
  11. ) AS [SourceTable]
  12. PIVOT (
  13. COUNT([學生編號])
  14. FOR [班級] IN (
  15. [初一 1班], [初一 2班],
  16. [初二 1班],
  17. [初三 1班], [初三 2班]
  18. )
  19. ) AS [PivotTable]

在結果表中我們看到了對于不存在的班級初一2班它的總人數(shù)為0,這符合我們預期的結果!

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

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

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

語法:

 
 
 
 
  1. SELECT
  2. <未透視的列>,
  3. [第一個透視列] AS <列別名>,
  4. [第二個透視列] AS <列別名>,
  5. ...
  6. [最后一個透視列] AS <列別名>
  7. FROM (
  8. ) AS <源表>
  9. PIVOT (
  10. <聚合函數(shù)>(<列>)
  11. FOR [<需要轉換為行的列>] IN (
  12. [第一個透視列], [第二個透視列],
  13. ...
  14. [最后一個透視列]
  15. )
  16. ) AS <數(shù)據(jù)透視表>
  17. <可選的ORDER BY子句>;

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

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

--使用PIVOT查詢班級內(nèi)的男女學生人數(shù)及總人數(shù)

 
 
 
 
  1. SELECT
  2. [所屬班級] AS [班級],
  3. [男] AS [男生人數(shù)],
  4. [女] AS [女生人數(shù)],
  5. [男] + [女] AS [總人數(shù)]
  6. FROM (
  7. SELECT [學生編號], [所屬班級], [性別] FROM #Student
  8. ) AS [SourceTable]
  9. PIVOT (
  10. COUNT([學生編號])
  11. FOR [性別] IN (
  12. [男], [女]
  13. )
  14. ) AS [PivotTable]
  15. ORDER BY [總人數(shù)] DESC

#p#

三、使用UNPIVOT 實現(xiàn)的功能其實與PIVOT恰恰相反

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

 
 
 
 
  1. SELECT
  2. <未逆透視的列>,
  3. [合并后的列] AS <列別名>,
  4. [行值的列名] AS <列別名>
  5. FROM (
  6. ) AS <源表>
  7. UNPIVOT (
  8. <行值的列名>
  9. FOR <將原來多個列合并到單個列的列名> IN (
  10. [第一個合并列], [第二個合并列],
  11. ...
  12. [最后一個合并列]
  13. )
  14. ) AS <數(shù)據(jù)逆透視表>
  15. <可選的ORDER BY子句>;

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

--源表

 
 
 
 
  1. SELECT
  2. '班級總人數(shù):' AS [總人數(shù)],
  3. [初一 1班], [初一 2班],
  4. [初二 1班],
  5. [初三 1班], [初三 2班]
  6. INTO #PivotTable --為了使表達意圖更清晰,我把PIVOT處理后的表放到一個臨時表當中
  7. FROM (
  8. SELECT
  9. [所屬班級] AS [班級],
  10. [學生編號]
  11. FROM #Student
  12. ) AS [SourceTable]
  13. PIVOT (
  14. COUNT([學生編號])
  15. FOR [班級] IN (
  16. [初一 1班], [初一 2班],
  17. [初二 1班],
  18. [初三 1班], [初三 2班]
  19. )
  20. ) AS [PivotTable]

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

--結果

 
 
 
 
  1. SELECT
  2. [班級], [總人數(shù)]
  3. FROM (
  4. SELECT
  5. [初一 1班], [初一 2班],
  6. [初二 1班],
  7. [初三 1班], [初三 2班]
  8. FROM
  9. #PivotTable
  10. ) AS [s]
  11. UNPIVOT (
  12. [總人數(shù)]
  13. FOR [班級] IN (
  14. [初一 1班], [初一 2班],
  15. [初二 1班],
  16. [初三 1班], [初三 2班]
  17. )
  18. ) AS [un_p]

執(zhí)行下面代碼:

 
 
 
 
  1. SELECT
  2. [所屬班級] AS [班級],
  3. [男] AS [男生人數(shù)],
  4. [女] AS [女生人數(shù)],
  5. [男] + [女] AS [總人數(shù)]
  6. INTO #PivotTable2 --放到臨時表方便查詢
  7. FROM (
  8. SELECT [學生編號], [所屬班級], [性別] FROM #Student
  9. ) AS [SourceTable]
  10. PIVOT (
  11. COUNT([學生編號])
  12. FOR [性別] IN (
  13. [男], [女]
  14. )
  15. ) AS [PivotTable]
  16. ORDER BY [總人數(shù)] DESC
  17. SELECT
  18. [班級],
  19. [男生或女生人數(shù)],
  20. [性別],
  21. [總人數(shù)]
  22. FROM (
  23. SELECT [班級], [男生人數(shù)], [女生人數(shù)], [總人數(shù)] FROM #PivotTable2
  24. ) AS [s]
  25. UNPIVOT (
  26. [男生或女生人數(shù)]
  27. FOR [性別] IN (
  28. [男生人數(shù)],
  29. [女生人數(shù)]
  30. )
  31. ) AS [un_p]

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

 
 
 
 
  1. SELECT
  2. [班級],
  3. [性別] + ': ' + CAST([男生或女生人數(shù)] AS NVARCHAR(1)) AS [男生或女生人數(shù)],
  4. [總人數(shù)]
  5. FROM (
  6. SELECT [班級], [男生人數(shù)], [女生人數(shù)], [總人數(shù)] FROM #PivotTable2
  7. ) AS [s]
  8. UNPIVOT (
  9. [男生或女生人數(shù)]
  10. FOR [性別] IN (
  11. [男生人數(shù)],
  12. [女生人數(shù)]
  13. )
  14. ) AS [un_p]

關于PIVOT和UNPIVOT命令的使用就介紹到這里,如果想了解更多SQL的知識可以去看看這里的文章:http://database./sqlserver/,絕對不會讓您失望的哦!


分享標題:T-SQL行列相互轉換命令:PIVOT和UNPIVOT使用詳解
當前路徑:http://www.dlmjj.cn/article/ccescos.html