SQL - WHERE AGGREGATE > 1
Question
Imaginez que j'ai une table de base de données de clients contenant {id, nom d'utilisateur, prénom, nom}
Si je veux savoir combien d'instances il y a différents prénoms que je peux faire:
select firstname,count(*) from Customers group by 2 order by 1;
username | count(*)
===================
bob | 1
jeff | 2
adam | 5
Comment puis-je écrire la même requête pour ne renvoyer que les prénoms qui apparaissent plusieurs fois? c'est-à-dire que, dans l'exemple ci-dessus, ne renvoie que les lignes pour jeff et adam.
La solution
Vous voulez que la clause ait
, comme ceci:
select
firstname,
count(*)
from Customers
group by firstname
having count(*) > 1
order by 1
Autres conseils
groupe par 2 ordre par 1
est terrible, devrais-je dire. Utilisez des noms de colonne appropriés, si cela est pris en charge: cela améliorera considérablement la lisibilité.
Dans cet esprit,
select firstname, count(*) c
from Customers
group by firstname
having count(*) > 1 -- Kudos to Shannon
order by c;
C'est ce que fait la clause HAVING. Je ne sais pas si cela fonctionnera dans informix, mais tentez votre chance:
select firstname, count(*)
from Customers
group by firstname
HAVING COUNT(*) > 1