Pivot Query – SQL server 2005

Ich habe die folgende Abfrage in SQL server 2005, die das Ergebnis, das unten erwähnt wird, abruft.

select Distinct(date),id, sum(convert(float,Gross)), count(*) as no from Daily group by date,id order by date desc Date id Gross Count 2012-11-25 00:00:00.000 Client id1 1232.6140752 12 2012-11-25 00:00:00.000 Client id2 1183.75621528 88 2012-11-26 00:00:00.000 Client id3 4561.459086 67 2012-11-26 00:00:00.000 Client id4 6781.15660608 440 

Nun, wie bekomme ich das Ergebnis in folgendem Format. Das sieht aus wie eine Pivot-Abfrage ist bitte bitte helfen

 id Date1 Date2 Date3 Date4 Date5 Date6 Date7 Client id1 Gross Client id2 Gross Client id3 Gross 

Es gibt zwei Möglichkeiten, dass man PIVOT , entweder eine statice Version, wo Sie Hard-Code alle dateswerte oder eine dynamische Version, die die list der data zur Laufzeit zu generieren.

Statische Version:

Wenn Sie eine begrenzte Anzahl von data haben, wird Ihre Abfrage ähnlich sein.

 select id, [yourDate1], [yourDate2], [yourDate3] from ( select date, id, cast(gross as float) as gross from Daily ) src pivot ( sum(gross) for date in ([yourDate1], [yourDate2], [yourDate3]) ) piv; 

Siehe SQL Fiddle mit Demo

Dynamische Version:

Diese Version erzeugt dynamisches SQL, um die list der data zur Laufzeit zu erhalten. Ihr Code wird ähnlich sein:

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(date) from Daily FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT id, ' + @cols + ' from ( select date, id, cast(gross as float) as gross from Daily ) src pivot ( sum(gross) for date in (' + @cols + ') ) p ' execute(@query) 

Siehe SQL Fiddle mit Demo

 WITH a AS ( SELECT [Id], [Gross] , [DateRank] = DENSE_RANK() OVER (ORDER BY [Date]) FROM [Daily] ) SELECT * FROM a PIVOT ( SUM([Gross]) FOR [DateRank] IN ([1], [2], [3], [4], [5], [6], [7]) ) b