質問

2つのテーブルがあります:

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

すべての企業を取得し、従業員数で分類したい。

結果は次のようになります。

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

試しました:

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;

ただし、g.nameでグループ化するように指示されるため、機能しません:/

アイデアはありますか

役に立ちましたか?

解決

テーブルとカラムを同じものとしてエイリアス化したので、そうしないでください。無効ではありません。従うのは難しいです。

とにかく、 group by の集計ではない、選択しているすべての列を含めます:

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;

他のヒント

これをサブクエリとして試してください:

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

(ORMフレームワークなどのために)カウント結果を返したくない場合は、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;

postgreSQL 11でテスト済み

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top