2017-10-05 80 views
2

我有4個表(工作人員,組,部門,辦公室),並希望有一個SQL查詢,將返回一個報告(報告)。SQL多個表,並顯示,如果沒有記錄

Table: Workers 
    +------------+----------+--------------+ 
    | workers_id | group_id | workers_name | 
    +------------+----------+--------------+ 

    Table: Group 
    +------------+------------+---------+-----------+ 
    | group_id | group_name | dept_id | office_id | 
    +------------+------------+---------+-----------+ 

    Table: Department 
    +---------+----------+-----------+ 
    | dept_id | dept_name| office_id | 
    +---------+----------+-----------+ 

    Table: Office 
    +-----------+------------+ 
    | office_id | office_name| 
    +-----------+------------+ 

我已成功地使用下面的SQL語句,這將使我的結果答:

SELECT department.dept_name, count (workers.workers_id) as headcount, 
    FROM workers, group, department 
    WHERE workers.workers_id = group.group_id 
    AND group.dept_id = department.dept_id 
    GROUP BY group.group_id 

    Result A: 
    +------------+----------+ 
    | dept_name | headcount| 
    +------------+----------+ 
    | dept A  | 2  | 
    +------------+----------+ 
    | dept B  | 1  | 
    +------------+----------+ 
    | dept D  | 2  | 
    +------------+----------+ 
    | dept F  | 3  | 
    +------------+----------+ 

但是它不是上市部與0號工人(是有道理的,因爲有任何的arent)。是否可以繼續執行單個查詢以獲得以下結果?

Result: 
    +------------+----------+ 
    | dept_name | headcount| 
    +------------+----------+ 
    | dept A  | 2  | 
    +------------+----------+ 
    | dept B  | 1  | 
    +------------+----------+ 
    | dept C  | 0  | 
    +------------+----------+ 
    | dept D  | 2  | 
    +------------+----------+ 
    | dept E  | 0  | 
    +------------+----------+ 
    | dept F  | 3  | 
    +------------+----------+ 

我已經嘗試過isnull,左連接和聯合沒有任何運氣,我的sql-fu是在基本級別。希望對此有幫助。乾杯!

+3

提示今天:切換到現代的,明確的' JOIN'語法 - 更容易編寫(沒有錯誤),更易於閱讀,並且在需要時更容易轉換爲外連接。 – jarlh

+0

這不是你的查詢:-( – Strawberry

+1

GROUP BY是無效的,會在新版本的MySQL上產生一個錯誤(除非在兼容模式下),並且在舊版本中返回不可預知的數據一般的GROUP BY規則說:指定GROUP BY子句時,SELECT列表中的每個列引用都必須標識分組列或者是設置函數的參數。「 – jarlh

回答

0

我認爲以下查詢是你想要的。即使沒有人數,您也可以保留結果集中的每個部門,方法是從部門表中進行左連接,找到按部門查找人數的子查詢(如果該部門存在)。

SELECT 
    d.dept_id, 
    d.dept_name, 
    d.office_id, 
    COALESCE(t.cnt, 0) AS headcount 
FROM Department d 
LEFT JOIN 
(
    SELECT t1.dept_id, COUNT(*) AS cnt 
    FROM `Group` t1 
    INNER JOIN Workers t2 
     ON t1.group_id = t2.group_id 
    GROUP BY t1.dept_id 
) t 
    ON d.dept_id = t.dept_id; 
+0

所發現的那樣,你的SQL工作正常。謝謝! – Pixelaxle

1

既然你想爲部門的工人,我認爲你的意思是按dept_id(否則COUNT將計算按組的工作人員,不署。這將導致不正確的結果時,有一個以上的組一個部門)。此外,我猜workers.workers_id = group.group_id的加入並不打算:

SELECT d.dept_name, COUNT(w.workers_id) AS headcount 
    FROM Workers w 
     JOIN Grp g ON w.group_id = g.group_id 
     RIGHT JOIN Department d ON g.dept_id = d.dept_id 
    GROUP BY d.dept_id; 

NULLworkers_id旨意不會考慮在COUNT

注意:不要命名錶格,如關鍵字(GROUP)。

+0

你的SQL完美工作。謝謝! – Pixelaxle

0
SELECT dept_name, 
IF(count(workers_id) >0 ,count(*),0) AS headcount 
FROM workers, group, department 
WHERE workers.workers_id = group.group_id 
AND group.dept_id = department.dept_id 
GROUP BY group.group_id; 

您可以使用IF語句,IF語句的語法 是..

IF(Condetion,導致如果爲true,如果造成假)

+0

我修改了您的SQL以修復我的初始錯誤(即使用保留字GROUP和按部門分組)。它給了我我的結果A,所以IF如果沒有工人就不能顯示部門 – Pixelaxle

相關問題