用于计算相同类型元素之和的右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我猜这只是整个数据集的一个片段。