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?

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top