用于计算相同类型元素之和的右SQL查询

用于计算相同类型元素之和的右SQL查询,sql,Sql,我有一个分布表,如下所示 ItemKey DayId Phase Usage 300029892 20080702 4 2.323 300029892 20080702 5 2.828 300029892 20080702 6 2.275 300029892 20080702 4 2.312 300029892 20080702 5 2.87 300029892 20080702 6 2.35 3

我有一个分布表,如下所示

ItemKey     DayId    Phase  Usage
300029892   20080702    4   2.323
300029892   20080702    5   2.828
300029892   20080702    6   2.275
300029892   20080702    4   2.312
300029892   20080702    5   2.87
300029892   20080702    6   2.35
300029892   20080702    4   2.238
300029892   20080702    5   2.757
300029892   20080702    6   2.298
300029892   20080702    4   2.262
300029892   20080702    5   2.75
300029892   20080702    6   2.382
300029892   20080702    4   2.273
300029892   20080702    5   2.825
300029892   20080702    6   2.2
300029892   20080702    4   2.34
300029892   20080702    5   2.91
300029892   20080702    6   2.328
300029892   20080702    4   2.26
300029892   20080702    5   2.748
300029892   20080702    6   2.617
300029892   20080702    4   2.27
300029892   20080702    5   2.752
300029892   20080702    6   2.36
300029892   20080702    4   2.287
300029892   20080702    5   2.945
300029892   20080702    6   2.313
现在我想得到输出为

ItemKey,  UsageInPhase4,                      UsageInPhase5,  UsageInPhase6
300029892 Sum values in phase 4 over all days Similarly Ph 5  Similarly Ph 6
什么是正确的查询?这是我到目前为止所拥有的,但它仍然不是我想要的确切输出

select Itemkey, DayId, PHase, 
SUM(kwh_Del) over (partition by ItemKey) as TotalKwh,
SUM(kwh_Del) over (partition by PhaseKey)
from [dw].[Distribution]  FER
where FER.ItemKey = 300029892
and dayid = 20080702

类似于以下内容的透视查询应该可以工作:

SELECT
    ItemKey,
    DayId,
    SUM(CASE WHEN Phase = 4 THEN Usage ELSE 0 END) AS [UsageOverPhase4],
    SUM(CASE WHEN Phase = 5 THEN Usage ELSE 0 END) AS [UsageOverPhase5],
    SUM(CASE WHEN Phase = 6 THEN Usage ELSE 0 END) AS [UsageOverPhase6]
FROM [dw].[Distribution]
WHERE ItemKey = 300029892 AND
      DayId = 20080702
GROUP BY ItemKey,
         DayId

类似于以下内容的透视查询应该可以工作:

SELECT
    ItemKey,
    DayId,
    SUM(CASE WHEN Phase = 4 THEN Usage ELSE 0 END) AS [UsageOverPhase4],
    SUM(CASE WHEN Phase = 5 THEN Usage ELSE 0 END) AS [UsageOverPhase5],
    SUM(CASE WHEN Phase = 6 THEN Usage ELSE 0 END) AS [UsageOverPhase6]
FROM [dw].[Distribution]
WHERE ItemKey = 300029892 AND
      DayId = 20080702
GROUP BY ItemKey,
         DayId

如果阶段的数量可变,则可以使用如下动态查询:

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT
    ItemKey,
    DayId ' + STUFF(
    (SELECT ', SUM(CASE WHEN Phase = '+CAST(d.Phase AS VARCHAR(3))+' THEN Usage ELSE 0 END) AS [UsageOverPhase'+CAST(d.Phase AS VARCHAR(3))+']'
    FROM (SELECT DISTINCT Phase FROM [dw].[Distribution]) d)
    , 1, 0, '') + '
FROM [dw].[Distribution]
GROUP BY ItemKey,
         DayId'
Exec(@SQL)

这只是对@TimBiegeleisen answer的动态修改。

如果您有可变数量的阶段,您可以使用如下动态查询:

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = '
    SELECT
    ItemKey,
    DayId ' + STUFF(
    (SELECT ', SUM(CASE WHEN Phase = '+CAST(d.Phase AS VARCHAR(3))+' THEN Usage ELSE 0 END) AS [UsageOverPhase'+CAST(d.Phase AS VARCHAR(3))+']'
    FROM (SELECT DISTINCT Phase FROM [dw].[Distribution]) d)
    , 1, 0, '') + '
FROM [dw].[Distribution]
GROUP BY ItemKey,
         DayId'
Exec(@SQL)

这只是@TimBiegeleisen answer的动态修改。

整个表中的ItemKey和DayId值相同?!?Google“pivot query SQL”获取提示。表将具有不同的ItemKey和不同的DayId左对齐SQL非常难读取…@jarlh我猜这只是整个数据集的一个片段。整个表中的ItemKey和DayId值相同?!?Google“pivot query SQL”获取提示。表将具有不同的ItemKey和不同的DayId左对齐SQL非常难读取…@jarlh我猜这只是整个数据集的一个片段。