2011年4月27日 星期三

動態SQL Pivot

自從MS SQL2005後,MS SQL已經內建Pivot功能,SQL Pivot基本用法http://msdn.microsoft.com/zh-tw/library/ms177410.aspx,不過,說真的用了MS

SQL Pivot Function感覺還有點陽春,只能針對兩個欄位的其中一個欄位進行轉置,一個欄位固定,這樣往往不敷企業需求,在企業報表都是會有多個固定

欄位而針對一個欄位做轉置,直接使用MS SQL語法就有點虛的感覺。因此,為了針對可以動態指定轉置欄位且可以多個固定不轉置欄位,所以,需針對原

本Pivot功能稍作改良。為了讓轉置語法可以共用,因此在這邊寫成預存程序方式。



create PROCEDURE [dbo].[SP_Pivot](
                 @SourceTable varchar(max),
                 @Pivot_Fix_Column varchar(5000),
                 @Pivot_Value_Aggregate varchar(10),
                 @Pivot_Value_Column varchar(5000),
                 @Pivot_Column_List varchar(5000))
AS
BEGIN

   declare @columns varchar(max)
   declare @sql nvarchar(max)

   set @sql = N'set @columns = substring((select '', [''+convert(varchar,'+@Pivot_Column_List+')+'']'' from '+@SourceTable +' group by '+@Pivot_Column_List+' order by 1 for xml path('''')),2,8000)'

   execute sp_executesql @sql,
                         N'@columns varchar(max) output',
                         @columns=@columns output

   set @sql = N'SELECT * FROM
       (SELECT '+@Pivot_Fix_Column+','+@Pivot_Column_List+','+@Pivot_Value_Column+' from '+@SourceTable+') src
       PIVOT
       ('+@Pivot_Value_Aggregate+'('+@Pivot_Value_Column+') FOR '+@Pivot_Column_List+' IN ('+@columns+') ) pvt
       ORDER BY 1'
  
   execute sp_executesql @sql

END



SourceTable(需要轉置的資料表或是資料語法)
Pivot_Fix_Column(轉置後要呈現的欄位)
Pivot_Value_Aggregate(轉置同時要用的運算,example:sum,max…etc)
Pivot_Value_Column(對應到需要轉置欄位的value,only column)
Pivot_Column_List(需轉置欄位,only column)


透過此方式便可以讓最後處理好的資料表進行轉置

範例用法:
EXEC dbo.Sp_dynamicpivot '(select a,b,day,Qty from tmpA) a',' a,b','sum','QTY','Day'

沒有留言:

張貼留言