4

以下の 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]

私が達成したいのは、ピボットする列範囲を受け入れるように手順を変更することです。上記の例では、2 つの変数の値のみを取得しています。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 ソリューションで回答されています。

4

1 に答える 1

6

残念ながら、この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 クエリ文字列に追加されます。

于 2013-02-05T22:05:15.200 に答える