LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

利用SQL內置函數實現數據表行列轉換:PIVOT和UPIVOT函數

admin
2024年2月5日 13:39 本文熱度 838

數據庫自帶的行轉列函數有哪些呢?這里要介紹PIVOT 和 UNPIVOT 函數了。這兩個函數為我們提供了便捷的方式來實現數據表的行列轉換。PIVOT 用于旋轉數據,將行轉為列,UNPIVOT 是其逆操作,將列轉為行。

下面是一些示例:

PIVOT 示例:

SELECT * FROM ( SELECT year, month, qty FROM Sales)PIVOT (SUM(qty) FOR month IN ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

在這個例子中,我們將“月份”列中的每個月份轉換為了各自的列,并將每個月的銷售量總和填充到相應的列中。

UNPIVOT 示例:

SELECT * FROM ( SELECT year, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec FROM Sales) UNPIVOT (qty FOR month IN (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec))

在這個例子中,我們將每個月的列轉換為了一個“月份”列,并將相應的銷售量總和填充到新的“qty”列中。

目前,Oracle和SQL Server數據庫系統都支持 PIVOT 和 UNPIVOT 函數。MySQL和PostgreSQL并不直接支持,但可以通過其他SQL語句實現類似的效果(如上篇文章介紹的方法)。

那如果要轉為列的行,它的內容和個數不確定,該怎么辦?比如上面示例中的月份不是固定的12個月。

我首先想到的是利用SQL的子查詢,比如:

SELECT ...FROM ...PIVOT (SUM(value) FOR column IN (SELECT DISTINCT column FROM ...))


但以上查詢在SQL Server中是無效的,這是因為SQL Server和Oracle在編譯查詢時需要知道所有的列名,而子查詢返回的結果直到運行時才知道。

解決此問題的一種常見方法是使用動態SQL,即使用SQL編寫并執行SQL語句。這樣,你可以先運行一個查詢來獲取所有唯一的列或行名,然后將這些名字拼接到你的PIVOT或UNPIVOT查詢中,最后執行這個查詢。

假設我們有一個名為sales的表,其中包含以下數據:

Product   | Year | Sale
--------------------------
ProductA  | 2019 | 100
ProductA  | 2020 | 150
ProductB  | 2019 | 200
ProductB  | 2020 | 220
ProductC  | 2019 | 300
ProductC  | 2020 | 350


我們希望按產品進行行列轉換,得到以下結果:

Year | ProductA | ProductB | ProductC
--------------------------------------
2019 | 100      | 200      | 300
2020 | 150      | 220      | 350


如果產品的類別是固定的,我們可以使用靜態SQL來實現。例如,在SQL Server中,我們可以使用PIVOT操作符:

SELECT Year, [ProductA], [ProductB], [ProductC] FROM (SELECT Product, Year, Sale FROM sales) AS SourceTable PIVOT (SUM(Sale) FOR Product IN ([ProductA], [ProductB], [ProductC])) AS PivotTable;

但是,如果產品的類別是動態的,我們需要使用動態SQL。在SQL Server中,我們可以使用以下方法:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);SET @columns = STUFF((  SELECT ',' + QUOTENAME(Product)  FROM sales  GROUP BY Product  ORDER BY Product  FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
SET @sql = N'SELECT Year, ' + @columns + 'FROM (  SELECT Product, Year, Sale  FROM sales) AS SourceTablePIVOT (  SUM(Sale)  FOR Product IN (' + @columns + ')) AS PivotTable;';
EXEC sp_executesql @sql;

這個例子首先構造了一個包含所有產品的列名的字符串(@columns),然后使用這個字符串來構造PIVOT查詢的SQL語句(@sql),最后執行這個SQL語句。


該文章在 2024/2/6 18:47:06 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
中文字幕网在线网站 | 亚洲人成电影手机在线播放 | 中文字幕网在线网站 | 亚洲日韩五码一区二区 | 亚洲AⅤ优女AV综合久久久 | 亚洲色婷婷婷婷色五月 |