2017-10-05 82 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

相关问题