[英]Pivot Query - SQL Server 2005
我在 SQL Server 2005 中有以下查詢,它獲取下面提到的結果。
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
現在我如何獲得以下格式的結果。 這看起來像是需要一個數據透視查詢,請幫忙
id Date1 Date2 Date3 Date4 Date5 Date6 Date7
Client id1 Gross
Client id2 Gross
Client id3 Gross
有兩種方法可以PIVOT
,一種是靜態版本,您對所有日期值進行硬編碼,另一種是動態版本,它將在運行時生成日期列表。
靜態版本:
如果您的日期數量有限,您的查詢將與此類似。
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;
動態版本:
此版本生成動態 SQL 以在運行時獲取日期列表。 您的代碼將類似於:
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)
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.