2011-06-21 5 views
1

によるとによって、私は3つのテーブルグループの3つのテーブル

tbl_worker 

City WorkerName  Job 
10  Raymond Carpenter 
10  Sara  Programmer 
11  John  Painter 
11  Alice  Booker 

tbl_workshop 

City WorkshopName 
10  Dell   
11  Apple 
10  Sony 

Tbl_city 
    Id Name 
    10 Mexico 
    11 Sydney 

を持っている今、私はこのような結果が欲しい:

City WorkersQty WorkshopQry 
Mexico  2    2 
Sydney  2    1 

結果が異なる都市に登録されている労働者とのワークショップの数量を返します。 どのようなクエリを書くべきですか?

答えて

2

グループ個別tbl_workshoptbl_workerテーブル、そして結果を得るためにLEFT JOINを使用します。

SELECT c.City, 
    k.Cnt AS WorkersQty, 
    w.Cnt AS WorkshopQry 
FROM Tbl_city c 
    LEFT JOIN (
    SELECT City, COUNT(*) Cnt 
    FROM tbl_worker 
    GROUP BY City 
    ) k ON c.ID = k.City 
    LEFT JOIN (
    SELECT City, COUNT(*) Cnt 
    FROM tbl_workshop 
    GROUP BY City 
    ) w ON c.ID = w.City 

あなただけのワークショップのか、労働者を持っている都市を表示したい場合は、追加:

WHERE k.Cnt > 0 OR w.Cnt > 0 
+0

私は左側の参加について知っていますが、特にここで2回目の参加にそれについて私に説明することができます。 –

+0

@raymond 'LEFT'ジョインを' INNER'ジョインに並べて使用する必要がある理由は、都市に労働者が0人いる場合、またはワークショップが0人の場合にデータを表示することです。 –

+0

ありがとうあなたのコードは素晴らしいです –

0

Dense_rankを使用してワークショップまたはワーカーの数を取得する

SELECT city, MAX(WorkshopQty) AS WorkshopQty , MAX(WorkersQty) AS WorkersQty 
FROM (
     SELECT c.name AS City, 
       DENSE_RANK() OVER (PARTITION BY c.id ORDER BY WorkshopName) AS WorkshopQty, 
       DENSE_RANK() OVER (PARTITION BY c.id ORDER BY WorkerName) AS WorkersQty 
     FROM tbl_city c 
     INNER JOIN tbl_workshop s ON s.city = c.id 
     INNER JOIN tbl_worker w ON w.city = c.id 
    ) s 
GROUP BY City 
関連する問題