狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

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

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

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

數(shù)據(jù)庫(kù)自帶的行轉(zhuǎn)列函數(shù)有哪些呢?這里要介紹PIVOT 和 UNPIVOT 函數(shù)了。這兩個(gè)函數(shù)為我們提供了便捷的方式來(lái)實(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'))

在這個(gè)例子中,我們將“月份”列中的每個(gè)月份轉(zhuǎn)換為了各自的列,并將每個(gè)月的銷售量總和填充到相應(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))

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

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

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

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

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


但以上查詢?cè)赟QL Server中是無(wú)效的,這是因?yàn)镾QL Server和Oracle在編譯查詢時(shí)需要知道所有的列名,而子查詢返回的結(jié)果直到運(yùn)行時(shí)才知道。

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

假設(shè)我們有一個(gè)名為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)品進(jìn)行行列轉(zhuǎn)換,得到以下結(jié)果:

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


如果產(chǎn)品的類別是固定的,我們可以使用靜態(tài)SQL來(lái)實(shí)現(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)品的類別是動(dòng)態(tài)的,我們需要使用動(dòng)態(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è)例子首先構(gòu)造了一個(gè)包含所有產(chǎn)品的列名的字符串(@columns),然后使用這個(gè)字符串來(lái)構(gòu)造PIVOT查詢的SQL語(yǔ)句(@sql),最后執(zhí)行這個(gè)SQL語(yǔ)句。


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