2016-07-05 18 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により月額合計を取得したいのです:私はいくつかのPIVOTCROSS APPLY機能どこを見てきました

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 

列(この場合は月)が指定され、手作業でハードコードされます。 [Month]の値に基づいて列名を動的に簡単に作成する方法はありますか?

いずれにしても、どんな助けでも大歓迎です。

+0

ここをクリックしてください:http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query – vercelli

答えて

0

PIVOTは素晴らしいですが、ダイナミックピボットの大部分にストアドプロシージャを使用しています。

ソースは、テーブル、ビュー、#の一時、または追加の集合を定義することができさえ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 
関連する問題