欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

利用SQL內(nèi)置函數(shù)實現(xiàn)數(shù)據(jù)表行列轉(zhuǎn)換:PIVOT和UPIVOT函數(shù)

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

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

下面是一些示例:

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'))

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

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))

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

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

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

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

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


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

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

假設(shè)我們有一個名為sales的表,其中包含以下數(shù)據(jù):

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


我們希望按產(chǎn)品進行行列轉(zhuǎn)換,得到以下結(jié)果:

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


如果產(chǎn)品的類別是固定的,我們可以使用靜態(tài)SQL來實現(xiàn)。例如,在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;

但是,如果產(chǎn)品的類別是動態(tài)的,我們需要使用動態(tài)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;

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


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