13

これまでのところ答えが見つかりませんが、これは簡単なテクニックだと思います!

私は持っている

TIMESTAMP           | POINTNAME | VALUE
2012-10-10 16:00:00   AHU01       20
2012-10-10 16:00:00   AHU02       25
2012-10-10 16:00:15   AHU01       26
2012-10-10 16:00:15   AHU02       35

etc... (約 800 個の POINTNAMES の場合)

多くのポイント名があるので、ピボットの 'FOR' 定義の 'IN' 句にそれぞれをリストしたくありませんが (構文は以下に示します)、おそらくサブクエリを使用したいと考えています。

したがって、すべての POINTNAME 値を TIMESTAMP AND VALUE 列の列として取得したいので、1 つの TIMESTAMP 値と各 POINTNAME の多くの列を取得します。POINTNAME PER TIMESTAMP ごとに 1 つの値しかないため、集計する必要はありません。とにかく最大を選択するだけですか?

何かのようなもの:

SELECT [TIMESTAMP] FROM ( SELECT * FROM POINT_TABLE)
PIVOT( Max[Value] FOR [POINTNAME] IN (SELECT DISTINCT [POINTNAME] FROM POINT_TABLE)

生成するだろう-

   TIMESTAMP              AHU01          AHU02
 2012-10-10 16:00:00        20             25
 2012-10-10 16:15:00        26             35

おそらくこれほど単純ではないことは承知していますが、私が達成しようとしていることを理解していただければ幸いです。

ピボット構文:

SELECT <non-pivoted column>,
    [first pivoted column] AS <column name>,
    [second pivoted column] AS <column name>,
    ...
    [last pivoted column] AS <column name>
FROM
    (<SELECT query that produces the data>) 
    AS <alias for the source query>
PIVOT
(
    <aggregation function>(<column being aggregated>)
FOR 
[<column that contains the values that will become column headers>] 
    IN ( [first pivoted column], [second pivoted column],
    ... [last pivoted column])
) AS <alias for the pivot table>
<optional ORDER BY clause>;
4

1 に答える 1

13

動的な列数の場合、動的SQLを使用する必要があります

declare
    @cols nvarchar(max),
    @stmt nvarchar(max)

select @cols = isnull(@cols + ', ', '') + '[' + T.POINTNAME + ']' from (select distinct POINTNAME from TABLE1) as T

select @stmt = '
    select *
    from TABLE1 as T
        pivot 
        (
            max(T.VALUE)
            for T.POINTNAME in (' + @cols + ')
        ) as P'

exec sp_executesql  @stmt = @stmt

SQLフィドルの例

于 2012-11-06T06:18:30.913 に答える