¿Cómo ordenar por conteo personalizado con postgresql?
-
05-07-2019 - |
Pregunta
Tengo dos tablas:
Empresas: (id, nombre)
Trabajadores: (id, nombre, país)
Me gustaría obtener todas las empresas y clasificarlas por número de empleados de un país determinado.
Para una consulta que busque compañías que tengan más trabajadores de los EE. UU., el resultado debe dar:
#workers from USA | company id | company name
----------------------------------------------
90 6 foo corp
45 9 bar corp
0 3 foobar corp
Intenté:
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;
Pero eso es contar a todos los trabajadores independientemente de sus países.
¿Alguna idea?
Solución
Puede hacerlo fácilmente con una subconsulta correlacionada:
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
Otros consejos
¿Ayuda reemplazar COUNT (w.country = 'USA') por COUNT (*)? Creo que su consulta debe referirse a los campos de la tabla Empresas en lugar de a los trabajadores porque su unión izquierda deja abierta la posibilidad de que el conjunto de trabajadores retirados para una empresa / país específico sea el conjunto vacío.
Prueba:
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;