9
votes

Somme conditionnelle T-SQL

J'ai une table dans ce format xxx

J'ai besoin de faire ressortir la sortie comme suit: xxx

Ma question est, Comment puis-je obtenir la colonne «valide» - elle devrait faire la somme de Col3 uniquement si Col2 n'est pas null.

J'ai pu obtenir correctement le champ «total» à l'aide de la somme et du groupe par des clauses. Mais comment calculer la colonne "valide"?

Des idées? Merci beaucoup!


0 commentaires

3 Réponses :


-2
votes

Vous pouvez utiliser une sous-requête:

SELECT SUM(Col3) AS Total, 
       (SELECT SUM(Filtered.Col3) 
        FROM table Filtered 
        WHERE Filtered.Col1 = Grouped.Col1 
          AND Filtered.Col2 IS NOT NULL
       ) AS Valid
FROM table Grouped
GROUP BY Col1


0 commentaires

-2
votes

Cela devrait fonctionner ...

SELECT B.COL1, SUM(A.COL3) AS TOTAL, SUM(B.COL3) AS VALID
FROM 
(SELECT COL1, COL3 FROM ORIGINAL WHERE COL2 IS NULL) A
INNER JOIN (SELECT COL1, COL3 FROM ORIGINAL) B ON A.COL1 = B.COL1


0 commentaires

23
votes

Quelque chose comme ceci: xxx

Le "truc" est d'utiliser l'expression de cas pour renvoyer conditionnellement la valeur de Col3.


2 commentaires

Il existe plusieurs façons de renvoyer les ResultsT spécifiés. Un grand avantage de cette approche est la performance; Cela n'utilise qu'un seul passage dans les données. Cela évite les frais généraux d'une sous-requête corrélée (qui est couru pour chaque rangée renvoyée par la requête extérieure) (voir la réponse de SLAWS). Il évite également les frais généraux des tables dérivées (c'est-à-dire des vues intégrées en ligne) et une opération de jointure (comme dans la réponse de Chris Shain, que BTW ne garantit pas un résultat correct.)


C'est vraiment élégant et comme vous dites qu'un seul passage est nécessaire