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.
3 Réponses :
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.
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
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'
Merci, cela fonctionne parfaitement en retournant le total et peut être étendu pour plusieurs entrées.
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
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.