偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解

數(shù)據(jù)庫(kù) SQL Server
T-SQL語(yǔ)句中,PIVOT命令可以實(shí)現(xiàn)數(shù)據(jù)表的列轉(zhuǎn)行,UNPIVOT則與其相反,實(shí)現(xiàn)數(shù)據(jù)的行轉(zhuǎn)列。本文結(jié)合實(shí)例說(shuō)明了這一過(guò)程,希望能對(duì)您有所幫助。

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

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

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

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

如果不知道怎么看數(shù)據(jù)庫(kù)版本或兼容級(jí)別的話可以在SQL Server Management Studio新建一個(gè)查詢窗口輸入:print @@version,運(yùn)行之后在我的本機(jī)上得到:

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)

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

T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解 

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

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

1.在這里我們先構(gòu)建一個(gè)測(cè)試數(shù)據(jù)表(這里使用的是臨時(shí)表,以方便我們?cè)谕顺鰰?huì)話的時(shí)候自動(dòng)刪除表及其數(shù)據(jù))

首先我們先設(shè)計(jì)一個(gè)表架構(gòu)為#Student { 學(xué)生編號(hào)[PK],  姓名, 性別, 所屬班級(jí) }的表,然后編寫(xiě)如下T-SQL

--創(chuàng)建臨時(shí)表(僅演示,表結(jié)構(gòu)的不合理還請(qǐng)包涵)

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

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

  1. INSERT INTO #Student (  
  2.  
  3. [姓名], [性別], [所屬班級(jí)]  
  4.  
  5. )  
  6.  
  7. SELECT '李妹妹', '女', '初一 1班' UNION ALL  
  8.  
  9. SELECT '泰強(qiáng)', '男', '初一 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 '龍門(mén)', '男', '初三 1班' UNION ALL  
  24.  
  25. SELECT '小紅', '女', '初三 1班' UNION ALL  
  26.  
  27. SELECT '小李', '男', '初三 1班' UNION ALL  
  28.  
  29. SELECT '小黃', '女', '初三 2班' UNION ALL  
  30.  
  31. SELECT '旺財(cái)', '男', '初三 2班' UNION ALL  
  32.  
  33. SELECT '強(qiáng)強(qiáng)', '男', '初二 1班'; 

以下是查詢的結(jié)果:

學(xué)生編號(hào)

姓名

性別

所屬班級(jí)

1

李妹妹

初一 1班

2

泰強(qiáng)

初一 1班

3

泰映

初一 1班

4

何謝

初一 1班

5

李春

初二 1班

6

吳歌

初二 1班

7

林純

初二 1班

8

徐葉

初二 1班

9

龍門(mén)

初三 1班

10

小紅

初三 1班

11

小李

初三 1班

12

小黃

初三 2班

13

旺財(cái)

初三 2班

14

強(qiáng)強(qiáng)

初二 1班

2.查詢各班級(jí)的總?cè)藬?shù)

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

班級(jí)

人數(shù)

初二 1班

5

初一 1班

4

初三 1班

3

初三 2班

2

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

在此你會(huì)看到第一個(gè)PIVOT示例。是否很期待??

3.編寫(xiě)第一個(gè)PIVOT示例

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

T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解

在結(jié)果表中我們看到了對(duì)于不存在的班級(jí)初一2班它的總?cè)藬?shù)為0,這符合我們預(yù)期的結(jié)果!

解釋?zhuān)菏褂肞OVIT首先你需要在FROM子句內(nèi)定義2個(gè)表:

A.一個(gè)稱(chēng)為源表(SourceTable)。

B.另一個(gè)稱(chēng)為數(shù)據(jù)透視表(PivotTable)。

語(yǔ)法:

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

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

4.下面演示一個(gè)較為高級(jí)的行轉(zhuǎn)列的應(yīng)用示例

--使用PIVOT查詢班級(jí)內(nèi)的男女學(xué)生人數(shù)及總?cè)藬?shù)

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

T-SQL行列相互轉(zhuǎn)換命令:PIVOTH和UNPIVOT使用詳解

#p#

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

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

  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 <將原來(lái)多個(gè)列合并到單個(gè)列的列名> IN (  
  20.  
  21. [第一個(gè)合并列], [第二個(gè)合并列],  
  22.  
  23. ...  
  24.  
  25. [最后一個(gè)合并列]  
  26.  
  27. )  
  28.  
  29. ) AS <數(shù)據(jù)逆透視表> 
  30.  
  31. <可選的ORDER BY子句>

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

--源表

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

T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解

將多個(gè)列合并到單個(gè)列的轉(zhuǎn)換的語(yǔ)句!!!

--結(jié)果

  1. SELECT  
  2.  
  3. [班級(jí)], [總?cè)藬?shù)]  
  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. [總?cè)藬?shù)]  
  24.  
  25. FOR [班級(jí)] IN (  
  26.  
  27. [初一 1班], [初一 2班],  
  28.  
  29. [初二 1班],  
  30.  
  31. [初三 1班], [初三 2班]  
  32.  
  33. )  
  34.  
  35. ) AS [un_p] 

T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解 

執(zhí)行下面代碼:

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

T-SQL行列相互轉(zhuǎn)換命令:PIVOTH和UNPIVOT使用詳解

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

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

T-SQL行列相互轉(zhuǎn)換命令:PIVOT和UNPIVOT使用詳解

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

【編輯推薦】

  1. SQL Server角色成員身份和權(quán)限簡(jiǎn)介
  2. MSSQL數(shù)據(jù)庫(kù)跨表和跨數(shù)據(jù)庫(kù)查詢方法簡(jiǎn)介
  3. 屬性ErrorLogFile不可用于JobServer的解決方案
  4. 在SQL SERVER 2005執(zhí)行存儲(chǔ)過(guò)程的權(quán)限分配問(wèn)題
  5. SQL Server 2005數(shù)據(jù)庫(kù)分區(qū)數(shù)據(jù)的移入和移出操作
責(zé)任編輯:趙鵬 來(lái)源: 博客園
相關(guān)推薦

2015-07-22 12:42:36

Pivot行列轉(zhuǎn)換

2010-09-01 08:57:27

jQueryDOM對(duì)象

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查詢流程控制語(yǔ)句

2010-10-19 16:06:26

SQL Server索

2010-07-06 10:36:35

SQL Server

2011-03-31 09:30:27

SQL Server數(shù)管理SQL

2011-07-08 13:40:18

2010-05-05 14:27:34

Oracle SQL語(yǔ)

2023-08-15 08:26:34

SQL Server查找死鎖

2013-07-25 15:01:47

iOS開(kāi)發(fā)學(xué)習(xí)十六進(jìn)制和字符串轉(zhuǎn)換

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數(shù)PIVOT

2024-05-17 08:52:43

SQL實(shí)用技巧行列轉(zhuǎn)換

2009-07-01 02:29:24

臨時(shí)表T-SQL

2011-08-24 16:36:00

T-SQL

2011-02-25 14:42:10

SQLwith關(guān)鍵字
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)