1

私は部分的にこれを解決しようとしていますが、ピボットで解決できると思われるつまずきブロックにぶつかりました。

2 つの一時テーブル変数を組み合わせた次の SQL クエリがあります (これらは一時テーブルに変更される可能性があります。これは、何度もヒットするため、パフォーマンスが問題になる可能性があるためです)。

SELECT MeterId, MeterDataOutput.BuildingId, MeterDataOutput.Value, 
            MeterDataOutput.TimeStamp, UtilityId, SnapshotId 
        FROM @MeterDataOutput as MeterDataOutput INNER JOIN @InsertOutput AS InsertOutput 
                ON MeterDataOutput.BuildingId = InsertOutput.BuildingId
                AND MeterDataOutput.[Timestamp] = InsertOutput.[TimeStamp]

これにより、次の表が生成されます。

ステップ1

次に、次のようにクエリを変更して BuildingId、SnapshotId、Timestamp、Utility でグループ化し、SUM() 関数を適用して Value フィールドを集計しました (MeterId は不要として削除しました)。

SELECT MeterDataOutput.BuildingId, SUM(MeterDataOutput.Value) AS Value, MeterDataOutput.TimeStamp, UtilityId, SnapshotId 
FROM @MeterDataOutput as MeterDataOutput 
INNER JOIN @InsertOutput AS InsertOutput 
    ON MeterDataOutput.BuildingId = InsertOutput.BuildingId
    AND MeterDataOutput.[Timestamp] = InsertOutput.[TimeStamp]
GROUP BY MeterDataOutput.BuildingId, MeterDataOutput.TimeStamp, UtilityId, SnapshotId

このクエリは、次の表を提供します。

ステップ2

ここで少し困っているのは、UtilityId の値を列に変換し、Value フィールドの値を各列の下に配置することです。すなわち:

私の問題

参考までに、BuildingId、Timestamp、Snapshot、Value は可変です。UtilityId 値 6 は常に「電力」、7 は常に「ガス」、8 は常に「水」です。

私は実際にSQLヒバリの手を取り始めています:)

4

1 に答える 1

0

多分このようなもの:

SELECT
    pvt.BuildingId,
    pvt.SnapshotId,
    pvt.TimeStamp,
    pvt.[6] AS Electricity,
    pvt.[7] AS Gas,
    pvt.[8] AS Water
FROM
    (
    SELECT 
        MeterDataOutput.BuildingId, 
        MeterDataOutput.Value, 
        MeterDataOutput.TimeStamp, 
        UtilityId, 
        SnapshotId 
    FROM @MeterDataOutput as MeterDataOutput 
    INNER JOIN @InsertOutput AS InsertOutput 
        ON MeterDataOutput.BuildingId = InsertOutput.BuildingId
        AND MeterDataOutput.[Timestamp] = InsertOutput.[TimeStamp]
    ) AS SourceTable
PIVOT
(
    SUM(Value)
    FOR UtilityId IN ([6],[7],[8])
) AS pvt
于 2012-05-21T11:41:56.817 に答える