Come ordinare per conteggio con postgresql?
-
05-07-2019 - |
Domanda
Ho due tabelle:
Companies: (id, name, city)
Workers: (id, name)
Vorrei ottenere tutte le aziende e ordinarle per numero di dipendenti.
Il risultato dovrebbe dare:
count | company id | company name | city
------------------------------------------
90 6 foo corp NY
45 9 bar corp LA
0 3 foobar corp HO
Ho provato:
select
c.*,
count(w.id) as c
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
c desc;
Ma non funziona come mi dice di raggruppare anche per g.name: /
Qualche idea?
Soluzione
Hai modificato la tabella e la colonna come la stessa cosa, quindi non farlo. Non è invalido, è solo difficile da seguire.
Includi comunque tutte le colonne che stai selezionando che non sono aggregate nel tuo gruppo per
:
select
count(w.id) as mycount,
w.company_id,
c.company_name,
c.city
from
companies c
left join workers w on
c.id=w.company_id
group by
w.company_id,
c.company_name,
c.city
order by mycount desc;
Altri suggerimenti
Prova questo come sottoquery:
SELECT C.*
FROM
(
SELECT C.Id, C.Company_Name, C.City, COUNT(W.Id) AS CNT
FROM Companies C
LEFT JOIN Workers W ON W.Company_Id = C.Id
GROUP BY C.Id, C.Company_Name, C.City
) T
ORDER BY T.CNT
Se non si desidera che il risultato del conteggio sia restituito (a causa di un framework ORM o giù di lì), è possibile applicarlo direttamente nella clausola order by:
select
c.*
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
count(w.id) desc;
Testato in postgreSQL 11
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow