利用SQL內(nèi)置函數(shù)實(shí)現(xiàn)數(shù)據(jù)表行列轉(zhuǎn)換:PIVOT和UPIVOT函數(shù)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
數(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 示例:
在這個(gè)例子中,我們將“月份”列中的每個(gè)月份轉(zhuǎn)換為了各自的列,并將每個(gè)月的銷售量總和填充到相應(yīng)的列中。 UNPIVOT 示例:
在這個(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的子查詢,比如:
解決此問(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ù):
我們希望按產(chǎn)品進(jìn)行行列轉(zhuǎn)換,得到以下結(jié)果:
如果產(chǎn)品的類別是固定的,我們可以使用靜態(tài)SQL來(lái)實(shí)現(xiàn)。例如,在SQL Server中,我們可以使用PIVOT操作符:
但是,如果產(chǎn)品的類別是動(dòng)態(tài)的,我們需要使用動(dòng)態(tài)SQL。在SQL Server中,我們可以使用以下方法:
這個(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)文章
正在查詢... |