成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據庫 SQL Server
T-SQL語句中,PIVOT命令可以實現數據表的列轉行,UNPIVOT則與其相反,實現數據的行轉列。本文結合實例說明了這一過程,希望能對您有所幫助。

一、使用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

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

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

--給臨時表插入數據

  1. INSERT INTO #Student (  
  2.  
  3. [姓名], [性別], [所屬班級]  
  4.  
  5. )  
  6.  
  7. SELECT '李妹妹', '女', '初一 1班' UNION ALL  
  8.  
  9. SELECT '泰強', '男', '初一 1班' UNION ALL  
  10.  
  11. SELECT '泰映', '男', '初一 1班' UNION ALL  
  12.  
  13. SELECT '何謝', '男', '初一 1班' UNION ALL  
  14.  
  15. SELECT '李春', '男', '初二 1班' UNION ALL  
  16.  
  17. SELECT '吳歌', '男', '初二 1班' UNION ALL  
  18.  
  19. SELECT '林純', '男', '初二 1班' UNION ALL  
  20.  
  21. SELECT '徐葉', '女', '初二 1班' UNION ALL  
  22.  
  23. SELECT '龍門', '男', '初三 1班' UNION ALL  
  24.  
  25. SELECT '小紅', '女', '初三 1班' UNION ALL  
  26.  
  27. SELECT '小李', '男', '初三 1班' UNION ALL  
  28.  
  29. SELECT '小黃', '女', '初三 2班' UNION ALL  
  30.  
  31. SELECT '旺財', '男', '初三 2班' UNION ALL  
  32.  
  33. 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.查詢各班級的總人數

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

班級

人數

初二 1班

5

初一 1班

4

初三 1班

3

初三 2班

2

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

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

3.編寫第一個PIVOT示例

  1. SELECT  
  2.  
  3. '班級總人數:' AS [總人數],  
  4.  
  5. [初一 1班], [初一 2班],  
  6.  
  7. [初二 1班],  
  8.  
  9. [初三 1班], [初三 2班]  
  10.  
  11. FROM (  
  12.  
  13. SELECT  
  14.  
  15. [所屬班級] AS [班級],  
  16.  
  17. [學生編號]  
  18.  
  19. FROM #Student  
  20.  
  21. ) AS [SourceTable]  
  22.  
  23. PIVOT (  
  24.  
  25. COUNT([學生編號])  
  26.  
  27. FOR [班級] IN (  
  28.  
  29. [初一 1班], [初一 2班],  
  30.  
  31. [初二 1班],  
  32.  
  33. [初三 1班], [初三 2班]  
  34.  
  35. )  
  36.  
  37. ) AS [PivotTable] 

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

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

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

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

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

語法:

  1. SELECT  
  2.  
  3. <未透視的列>,  
  4.  
  5. [第一個透視列] AS <列別名>,  
  6.  
  7. [第二個透視列] AS <列別名>,  
  8.  
  9. ...  
  10.  
  11. [最后一個透視列] AS <列別名> 
  12.  
  13. FROM (  
  14.  
  15. <SELECT查詢> 
  16.  
  17. ) AS <源表> 
  18.  
  19. PIVOT (  
  20.  
  21. <聚合函數>(<>)  
  22.  
  23. FOR [<需要轉換為行的列>] IN (  
  24.  
  25. [第一個透視列], [第二個透視列],  
  26.  
  27. ...  
  28.  
  29. [最后一個透視列]  
  30.  
  31. )  
  32.  
  33. ) AS <數據透視表> 
  34.  
  35. <可選的ORDER BY子句>

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

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

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

  1. SELECT  
  2.  
  3. [所屬班級] AS [班級],  
  4.  
  5. [男] AS [男生人數],  
  6.  
  7. [女] AS [女生人數],  
  8.  
  9. [男] + [女] AS [總人數]  
  10.  
  11. FROM (  
  12.  
  13. SELECT [學生編號], [所屬班級], [性別] FROM #Student  
  14.  
  15. ) AS [SourceTable]  
  16.  
  17. PIVOT (  
  18.  
  19. COUNT([學生編號])  
  20.  
  21. FOR [性別] IN (  
  22.  
  23. [男], [女]  
  24.  
  25. )  
  26.  
  27. ) AS [PivotTable]  
  28.  
  29. ORDER BY [總人數] DESC 

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

#p#

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

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

  1. SELECT  
  2.  
  3. <未逆透視的列>,  
  4.  
  5. [合并后的列] AS <列別名>,  
  6.  
  7. [行值的列名] AS <列別名> 
  8.  
  9. FROM (  
  10.  
  11. <SELECT查詢> 
  12.  
  13. ) AS <源表> 
  14.  
  15. UNPIVOT (  
  16.  
  17. <行值的列名> 
  18.  
  19. FOR <將原來多個列合并到單個列的列名> IN (  
  20.  
  21. [第一個合并列], [第二個合并列],  
  22.  
  23. ...  
  24.  
  25. [最后一個合并列]  
  26.  
  27. )  
  28.  
  29. ) AS <數據逆透視表> 
  30.  
  31. <可選的ORDER BY子句>

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

--源表

  1. SELECT  
  2.  
  3. '班級總人數:' AS [總人數],  
  4.  
  5. [初一 1班], [初一 2班],  
  6.  
  7. [初二 1班],  
  8.  
  9. [初三 1班], [初三 2班]  
  10.  
  11. INTO #PivotTable --為了使表達意圖更清晰,我把PIVOT處理后的表放到一個臨時表當中  
  12.  
  13. FROM (  
  14.  
  15. SELECT  
  16.  
  17. [所屬班級] AS [班級],  
  18.  
  19. [學生編號]  
  20.  
  21. FROM #Student  
  22.  
  23. ) AS [SourceTable]  
  24.  
  25. PIVOT (  
  26.  
  27. COUNT([學生編號])  
  28.  
  29. FOR [班級] IN (  
  30.  
  31. [初一 1班], [初一 2班],  
  32.  
  33. [初二 1班],  
  34.  
  35. [初三 1班], [初三 2班]  
  36.  
  37. )  
  38.  
  39. ) AS [PivotTable] 

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

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

--結果

  1. SELECT  
  2.  
  3. [班級], [總人數]  
  4.  
  5. FROM (  
  6.  
  7. SELECT  
  8.  
  9. [初一 1班], [初一 2班],  
  10.  
  11. [初二 1班],  
  12.  
  13. [初三 1班], [初三 2班]  
  14.  
  15. FROM  
  16.  
  17. #PivotTable  
  18.  
  19. ) AS [s]  
  20.  
  21. UNPIVOT (  
  22.  
  23. [總人數]  
  24.  
  25. FOR [班級] IN (  
  26.  
  27. [初一 1班], [初一 2班],  
  28.  
  29. [初二 1班],  
  30.  
  31. [初三 1班], [初三 2班]  
  32.  
  33. )  
  34.  
  35. ) AS [un_p] 

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

執行下面代碼:

  1. SELECT  
  2.  
  3. [所屬班級] AS [班級],  
  4.  
  5. [男] AS [男生人數],  
  6.  
  7. [女] AS [女生人數],  
  8.  
  9. [男] + [女] AS [總人數]  
  10.  
  11. INTO #PivotTable2 --放到臨時表方便查詢  
  12.  
  13. FROM (  
  14.  
  15. SELECT [學生編號], [所屬班級], [性別] FROM #Student  
  16.  
  17. ) AS [SourceTable]  
  18.  
  19. PIVOT (  
  20.  
  21. COUNT([學生編號])  
  22.  
  23. FOR [性別] IN (  
  24.  
  25. [男], [女]  
  26.  
  27. )  
  28.  
  29. ) AS [PivotTable]  
  30.  
  31. ORDER BY [總人數] DESC  
  32.  
  33. SELECT  
  34.  
  35. [班級],  
  36.  
  37. [男生或女生人數],  
  38.  
  39. [性別],  
  40.  
  41. [總人數]  
  42.  
  43. FROM (  
  44.  
  45. SELECT [班級], [男生人數], [女生人數], [總人數] FROM #PivotTable2  
  46.  
  47. ) AS [s]  
  48.  
  49. UNPIVOT (  
  50.  
  51. [男生或女生人數]  
  52.  
  53. FOR [性別] IN (  
  54.  
  55. [男生人數],  
  56.  
  57. [女生人數]  
  58.  
  59. )  
  60.  
  61. ) AS [un_p] 

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

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

  1. SELECT  
  2.  
  3. [班級],  
  4.  
  5. [性別] + ': ' + CAST([男生或女生人數] AS NVARCHAR(1)) AS [男生或女生人數],  
  6.  
  7. [總人數]  
  8.  
  9. FROM (  
  10.  
  11. SELECT [班級], [男生人數], [女生人數], [總人數] FROM #PivotTable2  
  12.  
  13. ) AS [s]  
  14.  
  15. UNPIVOT (  
  16.  
  17. [男生或女生人數]  
  18.  
  19. FOR [性別] IN (  
  20.  
  21. [男生人數],  
  22.  
  23. [女生人數]  
  24.  
  25. )  
  26.  
  27. ) AS [un_p] 

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

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

【編輯推薦】

  1. SQL Server角色成員身份和權限簡介
  2. MSSQL數據庫跨表和跨數據庫查詢方法簡介
  3. 屬性ErrorLogFile不可用于JobServer的解決方案
  4. 在SQL SERVER 2005執行存儲過程的權限分配問題
  5. SQL Server 2005數據庫分區數據的移入和移出操作
責任編輯:趙鵬 來源: 博客園
相關推薦

2015-07-22 12:42:36

Pivot行列轉換

2010-09-01 08:57:27

jQueryDOM對象

2010-07-20 13:52:27

SQL Server

2011-10-19 10:07:16

T-SQL查詢變量

2010-01-08 10:00:29

JSON-lib包

2011-08-23 13:36:11

T-SQL查詢流程控制語句

2010-07-06 10:36:35

SQL Server

2010-10-19 16:06:26

SQL Server索

2011-03-31 09:30:27

SQL Server數管理SQL

2011-07-08 13:40:18

2010-05-05 14:27:34

Oracle SQL語

2023-08-15 08:26:34

SQL Server查找死鎖

2013-07-25 15:01:47

iOS開發學習十六進制和字符串轉換

2009-05-06 17:31:17

SQL EnlightT-SQL分析器

2010-12-06 09:26:23

SQL Server

2011-08-22 11:39:53

SQL Server數PIVOT

2009-07-01 02:29:24

臨時表T-SQL

2024-05-17 08:52:43

SQL實用技巧行列轉換

2011-02-25 14:42:10

SQLwith關鍵字

2011-04-01 16:30:26

T-SQLDateTime
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久国产精品 | 中文字幕亚洲欧美 | 波多野结衣av中文字幕 | 欧美日韩在线综合 | 久久精品69 | 亚洲精品自拍 | 国产一区精品 | 综合久久综合久久 | 国产98色在线 | 日韩 | 国产乱码精品一区二区三区中文 | 91在线视频一区 | 久久国内精品 | cao在线 | 国产精品久久一区二区三区 | 欧美亚洲视频 | 国产免费一区二区 | 久久久久久久av | 中文字幕日韩欧美一区二区三区 | 亚洲国产伊人 | 91成人精品 | 久久在线视频 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 一区二区高清不卡 | 久久69精品久久久久久国产越南 | 亚洲精品乱码久久久久v最新版 | www.亚洲成人网| 成人亚洲精品久久久久软件 | 酒色成人网 | 国产这里只有精品 | 日韩三级电影在线看 | 亚洲国产一区二区三区, | 中文字幕在线看 | 日韩精品久久久久 | 亚洲精品一区二区三区中文字幕 | 国产在线第一页 | 国产综合久久久久久鬼色 | 大象视频一区二区 | 欧美日韩精品一区二区 | 影音先锋欧美资源 | 澳门永久av免费网站 | 成人一区二区三区在线 |