Comment trier par compte personnalisé avec postgresql?
-
05-07-2019 - |
Question
J'ai deux tables:
Sociétés: (identifiant, nom)
Travailleurs: (identifiant, nom, pays)
Je voudrais obtenir toutes les entreprises et les trier par nombre d'employés d'un pays donné.
Pour une requête à la recherche d'entreprises ayant plus d'employés en provenance 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 indépendamment de leur pays.
Des idées?
La solution
Vous pouvez le faire facilement avec une sous-requête corrélée:
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
Autres conseils
Est-ce que le remplacement de COUNT (w.country = 'USA') par COUNT (*) vous aide? Je pense que votre requête doit faire référence à des champs de la table Sociétés et non à des travailleurs, car votre jointure gauche laisse ouverte la possibilité que l'ensemble des travailleurs sélectionnés pour une entreprise / un pays spécifique soit 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;