1
votes

Comment obtenir un total pour plusieurs instructions SUM

J'ai deux colonnes dont j'ai besoin pour faire la somme en fonction des instructions WHERE, chaque colonne renvoie ensuite un total et je dois également additionner les valeurs SUM résultantes pour donner un total final.

Je peux obtenir la valeur SUM individuelle pour chaque colonne utilisant UNION ALL mais ne peut pas les additionner pour un total final.

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';

Ce qui précède renvoie deux valeurs, une un total pour NILH1 et une pour NILH2, maintenant j'ai besoin pour les additionner pour obtenir le total final.


1 commentaires

C'est assez simple, vous pouvez simplement envelopper la requête interne dans un select sum (sum) externe de () comme InnerQuery - bien qu'il existe d'autres moyens d'obtenir les résultats que vous voulez sans faire un syndicat.


3 Réponses :


1
votes

Considérant que les deux requêtes ont le même WHERE n'est-ce pas aussi simple que:

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';

Pour effectuer un SUM sur une colonne vous vous n'avez pas besoin d'avoir plusieurs instructions SELECT , vous pouvez regrouper sur plusieurs colonnes dans la même instruction et utiliser ces expressions pour effectuer des calculs supplémentaires.


4 commentaires

Les clauses where font référence à différentes colonnes: NILH1 et NILH2 .


Je n'avais pas remarqué que @HABO, bel endroit.


Et corrigé @HABO


Brillant merci, fonctionne un charme et je peux le déployer sur un plus grand ensemble de données



1
votes

Utilisez l'agrégation conditionnelle; déplacer la condition de la clause WHERE vers la fonction 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 commentaires

Merci, cela fonctionne parfaitement en retournant le total et peut être étendu pour plusieurs entrées.



0
votes

Pour un tel exemple de données:

;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

vous pouvez utiliser CTE:

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  


0 commentaires