撰寫TSQL來動態產生PIVOT語法,讓報表產出更有彈性

撰寫TSQL來動態產生PIVOT語法,讓報表產出更有彈性

日前在PTT的Database版看見某位鄉民有個需求,需求如下

我有一個資料表A( ID, NAME)    <A1,A2,A3>
還有一個資料表B( ID, NAME)    <B1,B2,B3,B4,B5>
再來就是資料表C( ID, A的ID,  B的ID, C數值)
                                                                               
我要怎麼下查詢才能夠
     B1   B2   B3   B4   B5
     -----------------------
A1 |  C值  C值  0    0    C值
A2 |  0    0    0    0    0
A3 |  0    C值  0    C值  0

 

看見這樣的需求,第一個念頭就是用子查詢或pivot來做

因此自己就針對這樣需求來寫寫Code,並且筆記下來

 

我們先將基本環境及資料建立起來,如下圖所示。

1

 

 

Select出3個關聯的Table,確認一下我們填入的資料。

2

 

下圖中就是撰寫的Code,當然也可以用一句Query達到我們要的目的,但是個人覺得

如果能彈性的隨著A及B兩個Table的資料刪減來產出結果那就更好了。因此我的作法

就是寫成TSQL來動態串出語法。


Declare @Str Varchar(max);
Declare @Str2 Varchar(max);
Set @Str='';
Set @Str2='';
Select @Str=@Str +'IsNull(['+name+'],0) As '+name+',',@Str2=@Str2+'['+name+'],' From b;
Set @Str=Left(@Str,Len(@Str)-1);
Set @Str2=Left(@Str2,Len(@Str2)-1);
Exec('Select aname as Name,'+@Str+' From 
(Select a.name As aname,b.name As bname,c.value as value From a
Left Join c on c.aid=a.id
Left Join b on c.bid=b.id
) As TmpTb
Pivot
(Sum(value) For bname In('+@Str2+')) As PivotTb')

3

 

我是ROCK

rockchang@mails.fju.edu.tw