如何获得多个 SUM 语句的总数

Posted

技术标签:

【中文标题】如何获得多个 SUM 语句的总数【英文标题】:How to get a total for multiple SUM statements 【发布时间】:2019-09-07 14:00:40 【问题描述】:

我有两列需要根据 WHERE 语句求和,然后每列返回一个总计,我还需要将生成的 SUM 值相加得出最终总计。

我可以使用 UNION ALL 获得每列的单独 SUM 值,但不能将它们相加得到最终总数。

SELECT ISNULL(SUM(NILH1), 0) AS SUM
FROM [IG_300M19].[dbo].[Stn14_RFT]
WHERE NILH1 <= 25
  AND DateStamp BETWEEN '2019-03-17 08:00' AND '2019-04-17 08:00'

UNION ALL

SELECT ISNULL(SUM(NILH2), 0) AS SUM
FROM [IG_300M19].[dbo].[Stn14_RFT]
WHERE NILH2 <= 25
  AND DateStamp BETWEEN '2019-03-17 08:00' AND '2019-04-17 08:00';

上面返回两个值,一个是 NILH1 的总和,一个是 NILH2 的总和,现在我需要将它们加在一起得到最终的总和。

【问题讨论】:

这很简单,您可以将内部查询包装在外部 select sum(sum) from (&lt;inner query here&gt;) as InnerQuery 中 - 尽管还有其他方法可以在不进行联合的情况下获得您想要的结果。 【参考方案1】:

考虑到两个查询具有相同的WHERE,这不是那么简单:

SELECT SUM(ISNULL(CASE WHEN NILH1 <= 25 THEN NILH1 END, 0)) AS NILH1SUM,
       SUM(ISNULL(CASE WHEN NILH2 <= 25 THEN NILH2 END, 0)) AS NILH2SUM,
       SUM(ISNULL(CASE WHEN NILH1 <= 25 THEN NILH1 END, 0) + ISNULL(CASE WHEN NILH2 <= 25 THEN NILH2 END, 0)) AS TotalSum
FROM [IG_300M19].[dbo].[Stn14_RFT]
WHERE DateStamp BETWEEN '2019-03-17 08:00' AND '2019-04-17 08:00';

要对列执行SUM,您不需要多个SELECT 语句,您可以在同一语句中聚合多个列,并可以使用这些表达式进行进一步计算。

【讨论】:

where 子句引用不同的列:NILH1NILH2 我没有注意到@HABO,好地方。 并修复了@HABO 非常感谢,很有魅力,我可以将它推广到更大的数据集【参考方案2】:

使用条件聚合;将条件从WHERE 子句移至SUM 函数:

SELECT SUM(
    CASE WHEN NILH1 <= 25 THEN NILH1 ELSE 0 END +
    CASE WHEN NILH2 <= 25 THEN NILH2 ELSE 0 END
)
FROM [IG_300M19].[dbo].[Stn14_RFT]
WHERE DateStamp BETWEEN '2019-03-17 08:00' AND '2019-04-17 08:00'

【讨论】:

感谢这项工作完美地返回了总数,并且可以扩展为多个条目。【参考方案3】:

对于这样的示例数据:

select * into #tab from (
    select 1 as NILH1,  2 as NILH2, cast('2019-03-17 18:00' as datetime) as DateStamp
    union all select 2, 3, cast('2019-03-17 18:00' as datetime)
    union all select 3, 4, cast('2019-03-17 18:00' as datetime)
    union all select 4, 5, cast('2019-06-17 18:00' as datetime)
    union all select 28, 29, cast('2019-03-17 18:00' as datetime)
) data

select * from #tab

--  NILH1   NILH2  DateStamp
--  --------------------------------------
--  1       2      2019-03-17 18:00:00.000
--  2       3      2019-03-17 18:00:00.000
--  3       44     2019-03-17 18:00:00.000  
--  4       5      2019-06-17 18:00:00.000  <-- invalid timestamp
--  28      6      2019-03-17 18:00:00.000  

您可以使用 CTE:

;with SUMS as
(
    SELECT
        SUM(CASE WHEN NILH1 <= 25 THEN NILH1 ELSE 0 END) as NILH1SUM,
        SUM(CASE WHEN NILH2 <= 25 THEN NILH2 ELSE 0 END) as NILH2SUM
    FROM #tab
    WHERE DateStamp BETWEEN '2019-03-17 08:00' AND '2019-04-17 08:00'
)
select
    NILH1SUM as NILH1SUM,
    NILH2SUM as NILH2SUM,
    NILH1SUM + NILH2SUM as TOTAL
from
    SUMS

-- NILH1SUM NILH2SUM TOTAL
-- -----------------------
-- 6        11        17

【讨论】:

以上是关于如何获得多个 SUM 语句的总数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中打印 csv 文件中的记录总数?

如何获取列表中值的列总数 - 匿名类型的两倍

如何从具有子句的 DB2 中获取 count(*) 总数?

我如何创建一个可以给我累积总数的查询?

【写SQL语句】按照用户统计对应订单数和订单总金额?

自定义表达式总数