对最后一小时分组中的列值求和,然后将所有 5 的总和作为另一列中的总和
Posted
技术标签:
【中文标题】对最后一小时分组中的列值求和,然后将所有 5 的总和作为另一列中的总和【英文标题】:Sum a columns value in a group by for the last hour and then sum the total of all 5 as total in another column 【发布时间】:2020-02-12 16:58:47 【问题描述】:(mssql) 我在下面总结了当前月份 FurnNbr 的使用情况和组。我想将其修改为最后一小时的总和,并将所有 5 的总和汇总到另一列中
SELECT
FurnNbr,
Sum(Usage) as TotalUsage
FROM
ChlUsage (nolock)
WHERE
DateTm Between
DATEADD(month, DATEDIFF(month, 0, getDate()), 0)
and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
GROUP BY
FurnNbr
ORDER BY
By FurnNbr asc
数据必须是过去一小时或 now() 减去一小时的数据。
FurnNbr / TotalUsage / TotalUsageOfAll5
1 10 50
2 10
3 10
4 10
5 10
【问题讨论】:
请提供示例数据和预期结果以澄清您的问题。 我编辑了我的帖子以展示一个示例 别到处乱喷nolock。如果您确实使用了提示,请不要使用已弃用的语法! 【参考方案1】:要过滤最后一小时而不是上个月,您只需修改where
子句。最重要的是,您可以使用窗口函数来计算总和:
SELECT
FurnNbr,
SUM(Usage) as TotalUsage,
SUM(SUM(Usage)) OVER() TotalUsageOfAll
FROM ChlUsage
WHERE DateTm >= DATEADD(hour, -1, getDate()) AND DateTm < getDate()
GROUP BY FurnNbr
ORDER BY FurnNbr
如果您只想在第一行显示总计:
CASE WHEN ROW_NUMBER() OVER(ORDER BY FurnNbr) = 1
THEN SUM(SUM(Usage)) OVER()
END TotalUsageOfAll
【讨论】:
行得通,有没有办法为 TotalUsageOfAll 做一次退货? GMB,CASE语句去哪了? 替换表达式SUM(SUM(Usage)) OVER() TotalUsageOfAll
我将如何只做当前小时的 TotalUsageOfAll 而不是现在减去一小时。我希望在当前小时内获取数据。
@JShaffer:您可以使用类似于您最初使用的表达式来做到这一点(只需使用hour
而不是month
)。以上是关于对最后一小时分组中的列值求和,然后将所有 5 的总和作为另一列中的总和的主要内容,如果未能解决你的问题,请参考以下文章