J'ai une table dans ce format J'ai besoin de faire ressortir la sortie comme suit: p> Ma question est, Comment puis-je obtenir la colonne «valide» - elle devrait faire la somme de Col3 uniquement si Col2 n'est pas null. P> 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"? P> Des idées?
Merci beaucoup! P> p>
3 Réponses :
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
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
Quelque chose comme ceci: Le "truc" est d'utiliser l'expression de cas pour renvoyer conditionnellement la valeur de Col3. P> P>
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