Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL如何为PIVOT指定列列表范围?_Sql Server_Tsql_Pivot - Fatal编程技术网

Sql server TSQL如何为PIVOT指定列列表范围?

Sql server TSQL如何为PIVOT指定列列表范围?,sql-server,tsql,pivot,Sql Server,Tsql,Pivot,下面的SELECT语句来自一个存储过程,我使用它来检索随后发送到JSON的数据: 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 (

下面的SELECT语句来自一个存储过程,我使用它来检索随后发送到JSON的数据:

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]
我想完成的是修改过程以接受要透视的列范围。在上面的示例中,我只检索两个变量的值。如果我想检索variableid1到10,或者1到50呢?必须有一种检索1到10的方法,而不是:

 VariableID IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])
MSDN上的没有提到指定范围的方法


我意识到在存储过程中使用动态SQL是可能的,但是考虑到我自己对SQL的了解以及那些需要长期维护SQL的人的了解,我对使用动态SQL增加复杂性犹豫不决。这里有一个概念上类似的问题,请参阅,它是用动态SQL解决方案回答的。

不幸的是,
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)
关键是以下代码,它生成要成为列的
变量ID的列表:

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

这将创建所有
不同的
变量id的列表。然后将此列表添加到SQL查询字符串中以返回

感谢@bluefeet,非常感谢您的深入回复。可能重复