SQL?Server中的PIVOT與UNPIVOT用法具體示例詳解
引言
在數(shù)據(jù)分析與報表生成場景中,行列轉(zhuǎn)換是一個高頻需求。SQL Server 提供了 PIVOT
和 UNPIVOT
兩個強大的運算符,能夠幫助我們快速實現(xiàn)數(shù)據(jù)透視與逆透視操作。本文將結(jié)合具體示例,解析它們的核心用法。
一、PIVOT:將行轉(zhuǎn)換為列
PIVOT函數(shù)主要是用來將數(shù)據(jù)從行轉(zhuǎn)換成列。比如,如果有訂單數(shù)據(jù)表,里面有很多訂單的信息,可能按客戶ID、訂單日期等分組。使用PIVOT可以把這些重復(fù)的客戶信息排列成一個更緊湊的表格,每個客戶的訂單日期變成一列,這樣看起來更直觀。
核心作用
將某一列的唯一值作為新列名,并按需聚合關(guān)聯(lián)數(shù)據(jù)。
語法結(jié)構(gòu)
SELECT [非透視列], [透視列1], [透視列2], ... FROM ( SELECT [列1], [列2], [聚合列] FROM 表 ) AS 源表 PIVOT ( 聚合函數(shù)(聚合列) FOR [目標(biāo)列] IN ([透視值1], [透視值2], ...) ) AS 別名;
實戰(zhàn)示例
場景:統(tǒng)計各部門在不同季度的銷售額。
- 準(zhǔn)備數(shù)據(jù)
CREATE TABLE #Sales ( Department VARCHAR(50), Quarter CHAR(2), Amount DECIMAL(10,2) ); INSERT INTO #Sales VALUES ('HR', 'Q1', 20000), ('HR', 'Q2', 22000), ('IT', 'Q1', 35000), ('IT', 'Q3', 41000);
- 執(zhí)行 PIVOT
SELECT Department, [Q1], [Q2], [Q3], [Q4] FROM ( SELECT Department, Quarter, Amount FROM #Sales ) AS Src PIVOT ( SUM(Amount) FOR Quarter IN ([Q1], [Q2], [Q3], [Q4]) ) AS Pvt;
輸出結(jié)果:
二、UNPIVOT:將列轉(zhuǎn)換為行
UNPIVOT函數(shù),它的作用和PIVOT相反,是用來把數(shù)據(jù)從列轉(zhuǎn)換回行。比如,在PIVOT之后得到的一張表格里,如果需要進一步細分數(shù)據(jù)或者進行其他操作,可以用UNPIVOT來恢復(fù)原來的多行結(jié)構(gòu)。
核心作用
將多列合并為兩列(屬性名+屬性值),實現(xiàn)數(shù)據(jù)逆向透視。
語法結(jié)構(gòu)
SELECT [非透視列], [屬性列], [值列] FROM 表 UNPIVOT ( 值列 FOR 屬性列 IN ([列1], [列2], ...) ) AS 別名;
實戰(zhàn)示例
場景:將季度銷售額列還原為行結(jié)構(gòu)。
- 使用之前 PIVOT 的結(jié)果作為輸入
CREATE TABLE #PivotedSales ( Department VARCHAR(50), Q1 DECIMAL(10,2), Q2 DECIMAL(10,2), Q3 DECIMAL(10,2), Q4 DECIMAL(10,2) ); INSERT INTO #PivotedSales VALUES ('HR', 20000, 22000, NULL, NULL), ('IT', 35000, NULL, 41000, NULL);
- 執(zhí)行 UNPIVOT
SELECT Department, Quarter, Amount FROM #PivotedSales UNPIVOT ( Amount FOR Quarter IN (Q1, Q2, Q3, Q4) ) AS Unpvt;
輸出結(jié)果:
三、關(guān)鍵注意事項
數(shù)據(jù)類型一致性UNPIVOT 的所有列必須具有兼容的數(shù)據(jù)類型。
處理 NULL 值PIVOT 會自動過濾 NULL 值,可通過
ISNULL()
或COALESCE()
預(yù)處理。動態(tài)列處理當(dāng)透視列值不固定時,需使用動態(tài) SQL 拼接列名(示例需另寫代碼實現(xiàn))。
性能優(yōu)化對大型數(shù)據(jù)集建議建立合適索引,避免全表掃描。
四、典型應(yīng)用場景對比
操作 | 適用場景 | 示例 |
---|---|---|
PIVOT | 生成交叉報表、統(tǒng)計類報表 | 部門季度銷售匯總 |
UNPIVOT | 數(shù)據(jù)規(guī)范化、ETL預(yù)處理、存儲優(yōu)化 | 將多個月份列合并為日期維度 |
五、總結(jié)
- PIVOT 通過聚合實現(xiàn)行轉(zhuǎn)列,適合制作匯總視圖
- UNPIVOT 通過逆向操作恢復(fù)數(shù)據(jù)結(jié)構(gòu),適合數(shù)據(jù)清洗
- 二者配合使用可完成復(fù)雜數(shù)據(jù)轉(zhuǎn)換需求
到此這篇關(guān)于SQL Server中的PIVOT與UNPIVOT用法具體示例的文章就介紹到這了,更多相關(guān)SQLServer PIVOT與UNPIVOT用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
同一個sql語句 連接兩個數(shù)據(jù)庫服務(wù)器
在sqlserver查詢分析器中,一個sql語句連接兩個數(shù)據(jù)庫服務(wù)器的一種方法2009-08-08SQL Server中修改“用戶自定義表類型”問題的分析與方法
這篇文章主要給大家介紹了關(guān)于SQL Server中修改“用戶自定義表類型”問題的分析與方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09SQL Server使用CROSS APPLY與OUTER APPLY實現(xiàn)連接查詢
這篇文章介紹了SQL Server使用CROSS APPLY與OUTER APPLY實現(xiàn)連接查詢的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05sqlserver bcp(數(shù)據(jù)導(dǎo)入導(dǎo)出工具)一般用法與命令詳解
bcp是SQL Server中負責(zé)導(dǎo)入導(dǎo)出數(shù)據(jù)的一個命令行工具,它是基于DB-Library的,并且能以并行的方式高效地導(dǎo)入導(dǎo)出大批量的數(shù)據(jù)2012-07-07SQL Server無日志恢復(fù)數(shù)據(jù)庫(2種方法)
SQL Server數(shù)據(jù)庫中的日志文件可能會由于一些突發(fā)事件或者失誤造成丟失的嚴(yán)重后果,大家都知道,SQL Server數(shù)據(jù)庫中日志文件是很重要的,所以要及時的將丟失的日志文件給找回來。下文就為大家介紹一種恢復(fù)數(shù)據(jù)庫日志文件的方法。2015-08-08一步步教你建立SQL數(shù)據(jù)庫的表分區(qū)
分區(qū)存儲提高了數(shù)據(jù)庫的性能,被分區(qū)存儲的數(shù)據(jù)物理上是多個文件,但邏輯上任然是一個表,對表的任何操作都跟沒分區(qū)之前一樣。插入、刪除、查詢、更新等操作的時候,數(shù)據(jù)庫會自動為你找到對應(yīng)的分區(qū),然后執(zhí)行操作。2015-09-09SQL中WHERE變量IS NULL條件導(dǎo)致全表掃描問題的解決方法
今天在評審接手的項目中的存儲過程時,發(fā)現(xiàn)存在大量的在條件里判斷變量是否NULL的寫法2013-09-09