web-dev-qa-db-fra.com

SQL COUNT * GROUP BY plus grand que,

Je veux sélectionner les clés distinctes avec le numéro d'occurrence, cette requête semble fonctionner:

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
GROUP BY ItemMetaData.KEY 
ORDER BY count(*) desc;

Mais je veux également filtrer ces résultats, ce qui signifie que je ne veux que lorsque le nombre (*) est supérieur à 2500, donc seule une occurrence supérieure à 2500 sera affichée, mais:

SELECT * 
FROM 
(
    SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
    FROM ItemMetaData 
    GROUP BY ItemMetaData.KEY 
    ORDER BY count(*) desc
) as result WHERE count(*)>2500;

Malheureusement, cette requête entraîne une erreur de syntaxe. Pouvez-vous m'aider à atteindre mon exigence?

34
czupe

Clause HAVING pour les agrégats

SELECT ItemMetaData.KEY, ItemMetaData.VALUE, count(*) 
FROM ItemMetaData 
Group By ItemMetaData.KEY, ItemMetaData.VALUE
HAVING count(*) > 2500
ORDER BY count(*) desc;
70
Bill

Vous devez utiliser having avec des fonctions de groupe au lieu de where. Par exemple.:

select ..., count(*) from ... group by ... having count(*) > 2500;
9
Andrew Logvinov

Vous n'avez pas besoin d'utiliser une sous-requête - utilisez simplement une clause having au lieu de la clause where pour filtrer par une colonne agrégée.

SELECT
ItemMetaData.KEY, ItemMetaData.VALUE, count(*)
FROM ItemMetaData
GROUP BY ItemMetaData.KEY
HAVING count(*) > 2500
ORDER BY count(*) desc
7
dasblinkenlight

Voici l'explication: la clause WHERE introduit une condition sur les lignes individuelles; La clause HAVING introduit une condition sur les agrégations.

Utilisez WHERE avant GROUP BY et HAVING après GROUP BY. Ce n'est pas obligatoire, mais utile dans la plupart des cas.

SELECT 
       ItemMetaData.KEY, ItemMetaData.VALUE, СOUNT(*) 
FROM  ItemMetaData 
GROUP BY
       ItemMetaData.KEY, ItemMetaData.VALUE
HAVING СOUNT(*) > 2500
ORDER BY СOUNT(*) DESC;
0
Aleksei Litvinau