SQL: Comment filtrer après l'agrégation?
Il est très facile de supprimer des valeurs que vous ne voulez pas agrégés.
Par exemple:
SELECT department, SUM(sales) as "Total sales"
FROM order_details
GROUP BY department
HAVING SUM(sales) > 1000;
Qui exclut toutes les ventes d'une valeur de moins de 1000 à partir de la synthèse de l'agrégation.
Mais comment voulez-vous du filtre après l'agrégation?
E. g. WHERE ("Total sales"> 15000)
Edit: Ironie du sort, j'étais seulement, y compris HAVING SUM(sales) > 1000;
afin d'éviter toute confusion sur le type de requête nécessaire; parce que je ne suis pas vraiment intéressé à l'exclusion des articles à partir de la sommation, juste les résultats retournés! Merci, en dépit de la confusion!
- pouvez-vous donner des exemples d'enregistrements? Votre problème est simple, mais vous êtes déclaration est source de confusion.
- Ne pas comprendre votre question. Vous êtes déjà fait ce que vous demandez. Vous filtre de requête de tout le département avec une agrégation de moins de 1000. Pouvez-vous reformuler?
- Pour dire les choses autrement: un filtrage des valeurs renvoyées. La requête va exclure des résultats moins que X. Probablement la plus efficace des façons d'aller à ce sujet car il semble un peu du gaspillage de faire le calcul qui sera par la suite être exclus.
Vous devez vous connecter pour publier un commentaire.
La requête que vous avez est en train de faire ce que vous voulez et non ce que vous avez exprimé dans la question. Si vous souhaitez exclure toutes les ventes d'une valeur de moins de 1000, vous devez utiliser
WHERE sales > 1000
. Mais avecHAVING SUM(sales) > 1000
le filtrage est effectué après l'agrégation.L'écriture d'une sous-requête et l'ajout d'un autre
SELECT WHERE
sur le dessus de l'original de la requête est redondant.Veuillez voir violon pour obtenir des éclaircissements.
Si vous voulez filtrer les vendre avec une valeur de moins de 1000, le droit de requête est
Si vous voulez l'ensemble, et de ne garder que la somme soit plus de 15000, alors vous avez besoin de cette requête :
Vous pouvez le faire comme un processus en deux étapes en sélectionnant la somme dans une table temporaire, puis en sélectionnant à partir de la table temp: