日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

PIVOT 和 UNPIVOT 命令的SQL Server版本

發(fā)布時間:2025/4/14 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PIVOT 和 UNPIVOT 命令的SQL Server版本 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

I:使用 PIVOT 和 UNPIVOT 命令的SQL Server版本要求

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

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

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

如果不知道怎么看數(shù)據(jù)庫版本或兼容級別的話可以在SQL Server Management Studio新建一個查詢窗口輸入
print @@version
運行之后在我的本機(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)
然后我們選擇一個數(shù)據(jù)庫然后右鍵-屬性 選擇[選項]得到下圖的信息
?
在確認(rèn)數(shù)據(jù)庫的版本和兼容級別符合1,2點的要求后你才可以接著繼續(xù)往下學(xué)習(xí)

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

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

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

--創(chuàng)建臨時表(僅演示,表結(jié)構(gòu)的不合理還請包涵)
CREATETABLE #Student (
[學(xué)生編號]INTIDENTITY(1, 1) PRIMARYKEY,
[姓名]NVARCHAR(20),
[性別]NVARCHAR(1),
[所屬班級]NVARCHAR(20)
);

--給臨時表插入數(shù)據(jù)
INSERTINTO #Student (
[姓名], [性別], [所屬班級]
)
SELECT'李妹妹', '女', '初一 1班'UNIONALL
SELECT'泰強(qiáng)', '男', '初一 1班'UNIONALL
SELECT'泰映', '男', '初一 1班'UNIONALL
SELECT'何謝', '男', '初一 1班'UNIONALL
SELECT'李春', '男', '初二 1班'UNIONALL
SELECT'吳歌', '男', '初二 1班'UNIONALL
SELECT'林純', '男', '初二 1班'UNIONALL
SELECT'徐葉', '女', '初二 1班'UNIONALL
SELECT'龍門', '男', '初三 1班'UNIONALL
SELECT'小紅', '女', '初三 1班'UNIONALL
SELECT'小李', '男', '初三 1班'UNIONALL
SELECT'小黃', '女', '初三 2班'UNIONALL
SELECT'旺財', '男', '初三 2班'UNIONALL
SELECT'強(qiáng)強(qiáng)', '男', '初二 1班';

?

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

學(xué)生編號姓名性別所屬班級
1李妹妹初一 1班
2泰強(qiáng)初一 1班
3泰映初一 1班
4何謝初一 1班
5李春初二 1班
6吳歌初二 1班
7林純初二 1班
8徐葉初二 1班
9龍門初三 1班
10小紅初三 1班
11小李初三 1班
12小黃初三 2班
13旺財初三 2班
14強(qiáng)強(qiáng)初二 1班

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

SELECT
[所屬班級]AS[班級],
COUNT(1) AS[人數(shù)]
FROM #Student
GROUPBY[所屬班級]
ORDERBY[人數(shù)]DESC

?

班級人數(shù)
初二 1班5
初一 1班4
初三 1班3
初三 2班2

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

在此你會看到第一個PIVOT示例~_~

是否很期待??

3.編寫第一個PIVOT示例

SELECT
'班級總?cè)藬?shù):'AS[總?cè)藬?shù)],
[初一 1班], [初一 2班],
[初二 1班],
[初三 1班], [初三 2班]
FROM (
SELECT
[所屬班級]AS[班級],
[學(xué)生編號]
FROM #Student
) AS[SourceTable]
PIVOT (
COUNT([學(xué)生編號])
FOR[班級]IN (
[初一 1班], [初一 2班],
[初二 1班],
[初三 1班], [初三 2班]
)
) AS[PivotTable]

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

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

A.一個稱為源表(SourceTable)

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

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

以上的PIVOT子句內(nèi)的第1…n個透視列的值均為 需要轉(zhuǎn)換為行的列 的常量值,需要用[]括起,支持GUID,字符串及各種數(shù)字!
具體Technet地址為:?http://technet.microsoft.com/zh-cn/library/ms177410(SQL.100).aspx

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

--使用 PIVOT 查詢班級內(nèi)的男女學(xué)生人數(shù)及總?cè)藬?shù)
SELECT
[所屬班級]AS[班級],
[男]AS[男生人數(shù)],
[女]AS[女生人數(shù)],
[男]+[女]AS[總?cè)藬?shù)]
FROM (
SELECT[學(xué)生編號], [所屬班級], [性別]FROM #Student
) AS[SourceTable]
PIVOT (
COUNT([學(xué)生編號])
FOR[性別]IN (
[男], [女]
)
) AS[PivotTable]
ORDERBY[總?cè)藬?shù)]DESC

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

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

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

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

--源表

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


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

--結(jié)果
SELECT
[班級], [總?cè)藬?shù)]
FROM (
SELECT
[初一 1班], [初一 2班],
[初二 1班],
[初三 1班], [初三 2班]
FROM
#PivotTable
) AS[s]
UNPIVOT (
[總?cè)藬?shù)]
FOR[班級]IN (
[初一 1班], [初一 2班],
[初二 1班],
[初三 1班], [初三 2班]
)
) AS[un_p]


在這里也寫個比較高級的希望各位DBA莫笑!
覺得好的請[推薦]一下下,本人時間有限,未能逐一回復(fù),請見晾!首先謝謝各位看過本文的朋友!

SELECT
[所屬班級]AS[班級],
[男]AS[男生人數(shù)],
[女]AS[女生人數(shù)],
[男]+[女]AS[總?cè)藬?shù)]
INTO #PivotTable2 --放到臨時表方便查詢
FROM (
SELECT[學(xué)生編號], [所屬班級], [性別]FROM #Student
) AS[SourceTable]
PIVOT (
COUNT([學(xué)生編號])
FOR[性別]IN (
[男], [女]
)
) AS[PivotTable]
ORDERBY[總?cè)藬?shù)]DESC



SELECT
[班級],
[男生或女生人數(shù)],
[性別],
[總?cè)藬?shù)]
FROM (
SELECT[班級], [男生人數(shù)], [女生人數(shù)], [總?cè)藬?shù)]FROM #PivotTable2
) AS[s]
UNPIVOT (
[男生或女生人數(shù)]
FOR[性別]IN (
[男生人數(shù)],
[女生人數(shù)]
)
) AS[un_p]



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

SELECT
[班級],
[性別]+': '+CAST([男生或女生人數(shù)]ASNVARCHAR(1)) AS[男生或女生人數(shù)],
[總?cè)藬?shù)]
FROM (
SELECT[班級], [男生人數(shù)], [女生人數(shù)], [總?cè)藬?shù)]FROM #PivotTable2
) AS[s]
UNPIVOT (
[男生或女生人數(shù)]
FOR[性別]IN (
[男生人數(shù)],
[女生人數(shù)]
)
) AS[un_p]

IV:網(wǎng)友提問解答

就在2012-08-07突然收到一個園友的短消息問問題,正好今天上午思路一變有了答案就答復(fù)了他!

他的問題是這樣的把

IdSNameCourse1Course2Course3
1張三806070
2李四607057
3王五858794

變成下表

Course張三李四王五
Course1806085
Course2607087
Course3705794

以下是我簡陋的代碼回復(fù)...

select?1 as?Id, N'張三'?as?SName, 80 as?Course1, 60 as?Course2, 70 as?Course3 union?all select?2, N'李四', 60, 70, 57 union?all select?3, N'王五', 85, 87, 94 ;with?cte1 as?( ????select?1 as?Id, N'張三'?as?SName, 80 as?Course1, 60 as?Course2, 70 as?Course3 union?all ????select?2, N'李四', 60, 70, 57 union?all ????select?3, N'王五', 85, 87, 94 ), cte2 as?( ????select?SName, Course1 as?fs, N'Course1'?as?Course from?cte1 union?all ????select?SName, Course2, N'Course2'?from?cte1 union?all ????select?SName, Course3, N'Course3'?from?cte1 ) select ????Course, [張三], [李四], [王五] from?( ????select?* from?cte2 group?by?Course, SName, fs ) src pivot ( ????max(fs) ????for?SName in?( ????????[張三], [李四], [王五] ????) ) piv

本文已結(jié)束!!聲明: 本文版權(quán)歸作者dotNetDR_和博客園共有,轉(zhuǎn)載必須保留此段聲明。

轉(zhuǎn)載于:https://www.cnblogs.com/panmy/p/5107452.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的PIVOT 和 UNPIVOT 命令的SQL Server版本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。