1

我正在部分解决这个问题,但遇到了一个绊脚石,我认为可以通过枢轴来解决。

我有以下 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 值转换为列,并将值字段中的值放在每列下。IE:

我的问题

作为参考 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 回答