SQL PIVOT 測試結果
PIVOT 在我看來就是把某一欄位的值直接攤開來看
因此在此做一些測試 以下是測試資料表 01
DECLARE @columnGroup Nvarchar(Max) , @PIVOT Nvarchar(Max)
SELECT @columnGroup = COALESCE(@columnGroup + ',', '') + QUOTENAME(Mon)
FROM Test1
GROUP BY QUOTENAME(Mon)
SELECT @columnGroup
-- SELECT * FROM Test1 PIVOT (SUM(Pay) FOR Mon IN ([01],[02],[03],[04],[05],[06],[07],[08],[09])) as vt
SET @PIVOT = 'SELECT * FROM Test1 PIVOT (SUM(Pay) FOR Mon IN (' + @columnGroup + ')) as Pvt'
exec sp_sqlexec @PIVOT
DECLARE @columnGroup Nvarchar(Max) , @PIVOT Nvarchar(Max)
SELECT @columnGroup = COALESCE(@columnGroup + ',', '') + QUOTENAME(Mon)
FROM Test1
GROUP BY QUOTENAME(Mon)
SELECT @columnGroup
這一段可以顯示出 如何得出 [01],[02],[03] .... 之類的動態陣列
-- SELECT * FROM Test1 PIVOT (SUM(Pay) FOR Mon IN ([01],[02],[03],[04],[05],[06],[07],[08],[09])) as vt
這一段是仿造上面那一段,原因是因為 sp_sqlexec string 其實真的蠻難寫的,因為不到最後一步不知道如何處理 所以用一段可以正常跑的SQL 然後做成樣本之後翻成string
SET @PIVOT = 'SELECT * FROM Test1 PIVOT (SUM(Pay) FOR Mon IN (' + @columnGroup + ')) as Pvt'
exec sp_sqlexec @PIVOT
COALESCE(A , B) > 用法是在於 若A是Null 則 B 或者是AB
類似CASE
CASE WHEN A THEN A WHEN B THEN B END
QUOTENAME: 傳回 Unicode 字串,且附加了分隔符號,以便使輸入字串成為有效的
QUOTENAME(Mon) = [01] , [02] , [03] ...
參考:
http://sharedderrick.blogspot.com/2013/02/pivot-dynamic-pivot.html
https://littlehorseboy.github.io/2020/05/31/2020-t-sql-pivot/#%E7%89%B9%E5%88%A5%E5%8A%A0%E6%98%A0%EF%BC%8C%E5%8B%95%E6%85%8B-PIVOT%EF%BC%8C%E4%BD%BF%E7%94%A8-EXEC-sp-executesql
COALESCE:
https://docs.microsoft.com/zh-tw/previous-versions/sql/sql-server-2012/ms190349(v=sql.110)?redirectedfrom=MSDN
留言
張貼留言