SQL PIVOT 測試結果

PIVOT 在我看來就是把某一欄位的值直接攤開來看 

因此在此做一些測試 以下是測試資料表 01


以下是使用PIVOT 攤平後的結果,但是由於程式碼限制,因此無法使用 SELECT * FROM Test1 去進行動態攤平。
因此使用exec string 直接進行撰寫

  SELECT * FROM Test1 PIVOT (SUM(Pay) FOR Mon IN ([01],[02],[03],[04],[05],[06],[07],[08],[09],[10]) ) PVT

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

留言

這個網誌中的熱門文章

無法載入檔案或組件 'System.IO.Compression' 或其相依性的其中之一。

MongoDB 入門

javascript 更改屬性及創建標籤