2009-09-10 6 views
0

J'ai deux tables:Comment trier par compte personnalisé avec postgresql?

entreprises: (id, nom)

travailleurs: (id, nom, pays)

Je voudrais obtenir toutes les entreprises et les trier par nombre d'employés de un pays donné.

Pour une requête à la recherche pour les entreprises qui ont plus de travailleurs des États-Unis, le résultat devrait donner:

#workers from USA | company id | company name 
---------------------------------------------- 
     90    6   foo corp  
     45    9   bar corp  
     0    3   foobar corp  

J'ai essayé:

select 
    count(w.country='USA') as mycount, 
    w.company_id, 
    c.company_name 
from 
    companies c 
    left join workers w on 
     c.id=w.company_id 
group by 
    w.company_id, 
    c.company_name 
order by mycount desc; 

Mais c'est à compter tous les travailleurs quel que soit leur pays.

Des idées?

Répondre

3

Vous pouvez le faire facilement avec une sous-requête corrélative:

SELECT 
    (SELECT count(*) FROM workers w WHERE w.company_id=c.id AND w.country='USA') AS mycount, 
    c.id, 
    c.company_name 
FROM 
    companies c 
ORDER BY mycount DESC 
0

Est-ce que le remplacement de COUNT (w.country = 'USA') avec COUNT (*) aide? Je crois que votre requête doit se référer à des champs de la table Companies par opposition aux workers parce que votre jointure gauche laisse ouverte la possibilité que l'ensemble des travailleurs a tiré pour une société/pays spécifique est l'ensemble vide.

Essayez:

select count(*) as mycount, 
     c.company_id, 
     c.company_name 
from companies c 
left join workers w on c.id=w.company_id 
group by c.company_id, c.company_name 
order by mycount desc; 
+0

@Ggolo: voir mon modifier à ce poste. –

+0

En fait, je veux que ma requête retourne même les entreprises qui n'ont pas de travailleurs des États-Unis, dans ce cas mycount devrait retourner 0. – Ggolo

+0

en remplaçant COUNT (w.country = 'USA') avec COUNT (*) retourne tous les travailleurs, je veux numéro pour compter le nombre de travailleurs des États-Unis seulement. – Ggolo

Questions connexes