2016-07-05 17 views
0

我正在使用SQL Server 2008 R2,並希望爲我的數據集中的每個不同日期(月)動態創建一列提供幫助用戶每月的數量。因此,例如,我的數據是這樣的:動態地將不同的值轉換爲列標題(即月)

Emp  Month  QTY 
------------------------- 
John 3/1/2016 20 
John 3/1/2016 30 
John 4/1/2016 15 
John 6/1/2016 40 
Jim  2/1/2016 25 
Jim  4/1/2016 28 
Jim  5/1/2016 15 
Jim  5/1/2016 15 
Jim  6/1/2016 32 
Alex 4/1/2016 20 
Alex 4/1/2016 20 
Alex 4/1/2016 20 
Alex 5/1/2016 45 

,我想通過Emp只得到每月彙總,就像這樣:

Employee 2/1/2016 3/1/2016 4/1/2016 5/1/2016 6/1/2016 
-------------------------------------------------------------------- 
John  0   50   15   0   40 
Jim   25   0   28   30   32 
Alex  0   0   60   45   0 

我已經看到了一些PIVOTCROSS APPLY功能,其中手動指定和硬編碼列(本例中的月份)。有沒有一種簡單的方法來根據[Month]中的值動態創建這些列名稱?

無論哪種方式,任何幫助,非常感謝。

+0

看看這裏:http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – vercelli

回答

0

PIVOT很棒,但是我使用了一個存儲過程來存儲我的Dynamic Pivots。

源可以是表,視圖,#溫度,甚至是SQL

請注意,您可以定義附加聚集體(即總,最小值,最大值,平均值,STD ...)。您也可以定義其他組通過的,以及

Exec [prc-Pivot] '#Temp','Month','sum(Qty)[]','Emp','count(*)[Records],sum(Qty)[Total],min(Qty)[Min],max(Qty)[Max],Avg(Qty)[Avg]' 

返回 enter image description here

而且,只是爲了好玩...

Exec [prc-Pivot] 'Select *,Qtr=''Q''+concat(concat(DatePart(QQ,Month),''-''),Year(Month)) from #Temp','Emp','sum(Qty)[]','Qtr',null 

enter image description here

存儲過程

CREATE PROCEDURE [dbo].[prc-Pivot] (
    @Source varchar(1000),   -- Any Table or Select Statement 
    @PvotCol varchar(250),   -- Field name or expression ie. Month(Date) 
    @Summaries varchar(250),  -- aggfunction(aggValue)[optionalTitle] 
    @GroupBy varchar(250),   -- Optional additional Group By 
    @OtherCols varchar(500))  -- Optional Group By or aggregates 
AS 

--Exec [prc-Pivot] 'Select Year=Year(TR_Date),* From [Chinrus-Series].[dbo].[DS_Treasury_Rates]','''Q''+DateName(QQ,TR_Date)','avg(TR_Y10)[-Avg]','Year','count(*)[Records],min(TR_Y10)[Min],max(TR_Y10)[Max],Avg(TR_Y10)[Avg]' 


Set NoCount On 
Set Ansi_Warnings Off 

Declare @Vals varchar(max),@SQL varchar(max); 
Set @Vals = '' 
Set @OtherCols= IsNull(', ' + @OtherCols,'') 
Set @Source = case when @Source Like 'Select%' then @Source else 'Select * From '[email protected] end 
Create Table #TempPvot (Pvot varchar(100)) 
Insert Into #TempPvot 
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Source + ') A') 
Select @Vals = @Vals + ', isnull(' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot + ''' THEN '),')[', ' END),0) As [' + Pvot) From #TempPvot Order by Pvot 
Drop Table #TempPvot 
Set @SQL = Replace('Select ' + Isnull(@GroupBy,'') + @OtherCols + @Vals + ' From (' + @Source + ') PvtFinal ' + case when Isnull(@GroupBy,'')<>'' then 'Group By ' + @GroupBy + ' Order by ' + @GroupBy else '' end,'Select , ','Select ') 
--Print @SQL 
Exec (@SQL) 


Set NoCount Off 
Set Ansi_Warnings on 
相關問題