2010-04-27 7 views
1

Cette requête échoue quand j'ajoute la ligne indiquée ...besoin d'aide avec le groupe mysql simple, par requête

Select Companyid, count(*) as cnt 
from mytable 
where State is not null 
and cnt = 1 <------------------------- FAIL 
group by CompanyID 

Toute façon de le faire?

Voici un fond de longue haleine si ça vous aidera ....

J'ai une requête de table.

Voici un échantillon de la table:

CompanyID, State 
1,OH 
1,IL 
1,NY 
2,IL 
3,NY 
3,OH 
4,NY 
5,CA 
5,WA 

Je veux une requête qui va retourner quelque chose comme ceci:

2,IL 
4,NY 

J'ai ce jusqu'à

Select Companyid, count(*) as cnt 
from mytable 
where State is not null 
group by CompanyID 

Cette me donne le nombre de dossiers pour chaque entreprise.

IE:

1,3 
2,1 
3,2 
4,1 
5,2 

Maintenant, je veux filtrer la liste ci-dessus pour seulement deux enregistrements avec un résultat.

J'ai essayé d'ajouter une autre clause where, mais il a échoué:

Select Companyid, count(*) as cnt 
from mytable 
where State is not null 
and cnt = 1 <-------------------- FAIL 
group by CompanyID 
+0

Vous ne pouvez pas utiliser les résultats de la fonction d'agrégation dans une clause 'where'. O WH est appliqué au moment de la récupération. Mais au point, les résultats de "count" ne sont pas encore disponibles. C'est là que 'HAVING' entre en jeu, ce qui ressemble à 'where', mais est appliqué comme dernière étape de la requête, juste avant que les résultats ne soient retournés. –

Répondre

3

Vous pouvez utiliser un Having -clause pour limiter les dossiers qui se produisent une seule fois dans votre Group By:

Select companyId, state 
From mytable 
Where state Is Not Null 
Group By companyId 
Having Count(*) = 1 
1

cnt est une valeur globale. Par conséquent, il va dans une clause HAVING, pas une clause WHERE.

Select Companyid, count(*) as cnt 
from mytable 
where State is not null 
group by CompanyID 
HAVING count(*)=1;