Как получить сумму для нескольких операторов SUM - PullRequest
1 голос
/ 17 апреля 2019

У меня есть два столбца, которые мне нужны для суммирования на основе операторов WHERE, каждый столбец затем возвращает итоговое значение, и мне также необходимо сложить итоговые значения SUM, чтобы получить итоговое итоговое значение.

Я могу получить индивидуальное значение СУММЫ для каждого столбца с помощью UNION ALL, но затем не могу сложить их для получения итоговой суммы.

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, теперь мне нужно сложить их вместе, чтобы получить итоговое значение.

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Использовать условную агрегацию; переместить условие из условия 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'
1 голос
/ 17 апреля 2019

Учитывая, что оба запроса имеют одинаковое значение 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, вы можете объединить несколько столбцов в одном и том же выражении и использовать эти выражения для дальнейших вычислений.

0 голосов
/ 17 апреля 2019

Для таких примеров данных:

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
...