对最后一小时分组中的列值求和,然后将所有 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 的总和作为另一列中的总和的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 选择列,然后按日期对列值进行分组

基于不同表的行值对表中的列值求和

Webi - 当另一列值为空时隐藏中断中的列

如何通过为每个单独的列列出分组后的所有数据并求和

使用 PHP 显示单独的列值

对mysql中的多列求和