2012-11-26 186 views
1

我在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 

現在我如何得到以下格式的結果。這看起來像一個支點查詢REQD請幫助

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

你想要說'Date1','Date2'還是應該列有日期值的列? – Taryn

+0

日期值...一個月中的所有日子都會出現在表格中...所以我們每天都有總計 – Gallop

回答

2

有兩種方法可以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) 

SQL Fiddle with Demo

+0

+1我太慢了:) –

+0

Msg 8117,Level 16,State 1,Line 1 對於sum運算符,操作數數據類型varchar無效。 使用動態查詢時。 – Gallop

+0

@Moonwalk如果你的'gross'字段是'varchar',那麼你需要在內部查詢中執行'convert'。查看我的編輯 – Taryn

0
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