Pregunta

Tengo dos tablas:

Companies: (id, name, city)
Workers: (id, name)

Me gustaría obtener todas las empresas y ordenarlas por número de empleados.

El resultado debería dar:

count | company id | company name | city
------------------------------------------
90         6           foo corp      NY
45         9           bar corp      LA
0          3         foobar corp     HO

Intenté:

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;

Pero eso no funciona, ya que también me dice que agrupe por g.name: /

¿Alguna idea?

¿Fue útil?

Solución

Has alias la tabla y la columna como la misma cosa, así que no hagas eso. No es inválido, solo difícil de seguir.

De todos modos, incluya todas las columnas que está seleccionando que no son agregados en su grupo por :

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;

Otros consejos

Pruebe esto como una subconsulta:

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

Si no desea que se devuelva el resultado del recuento (debido a un marco ORM más o menos), puede aplicarlo directamente en el orden de la cláusula:

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;

Probado en postgreSQL 11

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top