2013-02-05 20 views
3

下面的SELECT語句是我使用來獲取其隨後被髮送到JSON數據存儲過程TSQL如何指定PIVOT的列表範圍?

SELECT * 
FROM (
    SELECT CAST(DateTimeUTC as SmallDateTime) as [DateTime], DataValue, VariableID 
    FROM DataValues 
    WHERE SiteID = @siteID and VariableID BETWEEN 9 and 10 and DateTimeUTC >= DATEADD (day, @pastDays, getdate()) 
    ) TableDate 
PIVOT (SUM(DataValue) FOR VariableID IN ([9],[10])) PivotTable ORDER BY [DateTime] 

我想什麼來完成是修改程序來接受一列範圍樞。在上面的例子中,我只檢索兩個變量的值。如果我想檢索VariableID 1到10或1到50,該怎麼辦?必須有比其他的方式來獲取1到10的方式:

VariableID IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10]) 

MSDN上Using PIVOT and UNPIVOT沒有提到的方式來指定一個範圍。

我意識到可以在存儲過程中使用動態SQL,但考慮到我自己對SQL的瞭解以及那些必須保持這種長期的知識,我不願意通過使用動態SQL來引入額外的複雜性。這裏有一個概念上類似的問題,請參閱TSQL Pivot Long List of Columns,並用動態SQL解決方案回答。

+0

可能重複的[SQL Server - 列未聚合行](http://stackoverflow.com/questions/14857737/sql-server-rows-to-columns-without-aggregation) – RichardTheKiwi

回答

5

不幸的是,PIVOT函數沒有能力生成列的列表,沒有使用動態sql。

所以,你的SQL代碼將類似於此:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(VariableID) 
        from DataValues 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT [DateTime], ' + @cols + ' from 
      (
       SELECT CAST(DateTimeUTC as SmallDateTime) as [DateTime], 
        DataValue, 
        VariableID 
       FROM DataValues 
       WHERE SiteID = '+cast(@siteID as varchar(10))+' 
        -- and VariableID BETWEEN 9 and 10 -- remove the variableID filter 
        and DateTimeUTC >= DATEADD (day, +'cast(@pastDays as varchar(10))+', getdate()) 
      ) x 
      pivot 
      (
       SUM(DataValue) 
       for VariableID in (' + @cols + ') 
      ) p ' 

execute(@query) 

這裏的關鍵是產生的variableIds列表下面的代碼,成爲列:

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(VariableID) 
        from DataValues 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

這將創建所有distinct變量ID的列表。然後將此列表添加到SQL查詢字符串以返回。

+0

謝謝@bluefeet你的in-深度響應非常感謝。 –

+0

@RealityExtractor歡迎您,很高興爲您提供幫助 – Taryn