2013-01-03 16 views
1
;WITH myRubbish AS 
    (
    SELECT user, [20121231], [20130101], [20130102] 
    FROM 
     ( 
     SELECT 
      DateKey, 
      user, 
      revenue 
     FROM xxx.dbo.yyy 
     WHERE DateKey > CONVERT(CHAR(8),GETDATE()-4,112) 
     ) x 
     PIVOT 
     (
     SUM(revenue) 
     FOR DateKey IN ([20121231], [20130101], [20130102]) 
     ) u 
    ) 
SELECT * 
FROM myRubbish; 

我該如何調整它以便它可以每天運行並且列會自動重新命名爲過去3天?在滾動天數上使用PIVOT

+1

http://stackoverflow.com/a/11224988/971839 – halit

+0

@halit很好的參考 - 謝謝你 – whytheq

回答

4

您將需要實現查詢的動態SQL版本。此類似:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(CHAR(8), DateKey, 112)) 
        from xxx.dbo.yyy 
        WHERE DateKey > CONVERT(CHAR(8),GETDATE()-4,112) 
         -- and Datekey <= CONVERT(CHAR(8),GETDATE(),112) -- include this is you want to limit the records 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT [user],' + @cols + ' from 
      (
       SELECT DateKey, [user], revenue 
       FROM xxx.dbo.yyy 
       WHERE DateKey > CONVERT(CHAR(8),GETDATE()-4,112) 
        -- and Datekey <= CONVERT(CHAR(8),GETDATE(),112) -- include this is you want to limit the records 
      ) x 
      pivot 
      (
       SUM(revenue) 
       for DateKey in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

有一種感覺,這可能會導致回動態SQL – whytheq

+0

@whytheq不幸的是,如果你不不知道要轉移的列的值,那麼你唯一的選擇是動態SQL – Taryn