如何获得多个 SUM 语句的总数
How to get a total for multiple SUM statements
我有两列需要根据 WHERE 语句求和,然后每列 returns 总和,我还需要将得到的 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';
以上returns两个值,一个是NILH1,一个是NILH2,现在我需要把它们加在一起得到最终的总数。
考虑到两个查询具有相同的 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
子句移动到 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'
对于这样的示例数据:
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
我有两列需要根据 WHERE 语句求和,然后每列 returns 总和,我还需要将得到的 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';
以上returns两个值,一个是NILH1,一个是NILH2,现在我需要把它们加在一起得到最终的总数。
考虑到两个查询具有相同的 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
子句移动到 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'
对于这样的示例数据:
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