2011-06-21 70 views
1

我有三個表集團通過根據三個表

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

我對左連接有所瞭解,但是能否在第二次連接時特意解釋一下。 –

+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