2009-09-02 8 views
2

Imaginer que j'ai une table db de clients contenant {id, nom d'utilisateur, nom, prénom}SQL - comptage OU AGGREGATE> 1

Si je veux trouver combien de cas il y a différents prénoms que je peux faire:

select firstname, count(*) from Customers group by 2 order by 1; 

    firstname | count(*) 
    ==================== 
    bob  | 1 
    jeff  | 2 
    adam  | 5 

Comment compter le nombre de prénoms qui se produisent plus d'une fois? Dans pseudo-sql ce serait quelque chose comme:

select 
    COUNT(
     firstname, 
     count(*) as num_occurrences 
    ) 
from 
    Customers 
group by 2 
having num_occurrences > 1; 

Répondre

1

Cela ferait:

select count(username) 
    from (select username 
      from Customers 
     group by username 
     having count(*) > 1); 
+0

NB: question était confus au sujet de nom d'utilisateur vs prenom - cette réponse utilisée 'nom d'utilisateur' où va la question révisée avec 'Prénom'. –

5

Vous avez la bonne idée:

SELECT COUNT(*) 
FROM (
    SELECT firstname 
    FROM Customers 
    GROUP BY firstname 
    HAVING COUNT(*) >= 2 
) 

La sous-requête compte les premiers noms qui ont s'est produit plus d'une fois. Ensuite, vous comptez tous ces prénoms. La clause HAVING vous permet de filtrer par agrégats. C'est comme une clause WHERE, sauf que vous pouvez utiliser des fonctions d'agrégation.

+0

C'est trop compliqué - la réponse d'IniTech est meilleure. –

+0

Je préfère l'idée de cette solution car la base de données ne fait que retourner ce qui m'intéresse. Malheureusement, cela ne semble pas fonctionner dans Informix. :( –

+0

Ensuite, vous n'incluez pas la colonne dans la clause SELECT.Les sous-sélections et sous-requêtes doivent être évitées si possible –

2

Une sous-requête n'est pas nécessaire.

Essayez:

SELECT firstname, COUNT(*) 
    FROM Customers 
GROUP BY firstname 
HAVING COUNT(*) > 1 
ORDER BY firstname 

Ou, pour le nom le plus représenté:

SELECT firstname, COUNT(*) AS custcount 
    FROM Customers 
GROUP BY firstname 
HAVING COUNT(*) > 1 
ORDER BY custcount DESC; 
+0

Doit être référencé 'username', pas' firstname'. Il ne fournit pas non plus la réponse demandée - le nombre du nombre de commentaires –

+0

@Jonathon: La sortie n'aura pas de sens sans afficher le nom d'utilisateur auquel le compte s'applique. –

+0

@rexem: la question demande le nombre de clients avec plus d'une entrée dans la table avec le même nom d'utilisateur. Il ne demande pas les noms d'utilisateur, en soi; il demande le nombre de ces noms d'utilisateur. C'est une requête d'agrégat classique d'agrégats, et la sous-requête-dans-la-FROM-clause est la meilleure façon d'y répondre. –