2018年5月18日 星期五

[SQL Server] Pivot 動態產生欄位直橫互換的寫法

假設某水果攤進貨單資料如下,價格隨時間波動
進貨表 TableA
 進貨單號   水果   價格 
     001  蘋果   50
     002  香蕉   40
     003  橘子   50
     004  香蕉   45
     005  橘子   55

今天如果要將水果,蘋果,香蕉 變成欄位名稱 來顯示 如
    蘋果   香蕉   橘子 
 總進價格    50    85   105 

只要這麼寫就可以了

Select * From
(Select 水果,價格 From TableA) As A1
pivot
(SUM(價格) For 水果 IN ([蘋果],[香蕉],[橘子])) As A2

-----------------------------------------------

假設今天 進貨不清楚水果有幾種, 或者水果種類太多等
無法或不方便把 IN 後面的欄位寫清楚的情況下

這邊就可以用動態產生的方式

Declare @StrTital NVARCHAR(Max) =''         --宣告變數來儲存水果種類名稱
Declare @StrSQL NVARCHAR(Max) =''        --宣告變數用來組SQL字串,並拿來下指令


Select @StrTital= @StrTital+QUOTENAME(水果)+N',' From TableA Group By 水果

--QUOTENAME: 傳回 Unicode 字串,且附加了分隔符號,以便使輸入字串成為有效的 
 SQL Server 分隔識別碼

--執行結果: @StrTital= [蘋果],[香蕉],[橘子], ...

Set @StrTital=  Left(@StrTital, Len(@StrTital)-1)         --去除字串最後尾的','

Set @StrSQL= N' Select * From
(Select 水果,價格 From TableA) As A1
pivot
(SUM(價格) For 水果 IN ('+@StrTital+N')) As A2'

EXEC sp_executesql @StrSQL --執行SQL字串

以上寫法就會得到我們想要的結果

沒有留言:

張貼留言