我想统计每个区域所有员工的条件,哪个条件有两个参数,WELL和UNWELL。像这样,
conditions | area | count_conditions
Well AREA1 1
UNWELL AREA1 0
Well AREA2 5
UNWELL AREA2 1
...
这是迄今为止最接近的一次。
SELECT a.conditions, k.area,
SUM(CASE WHEN a.conditions IS NOT NULL THEN 1 ELSE 0 END) AS count_conditions
FROM tb_attended a
INNER JOIN tb_employees k ON a.nrp = k.nrp
AND a.date = '2020-07-20'
GROUP BY k.area, a.conditions
我上面的代码运行得很好,但如果在某个区域没有UNWELL或well的条目,那么这种情况就不会出现。就像这样。
conditions | area | count_conditions
Well AREA1 1
Well AREA2 5
UNWELL AREA2 1
...
这是我使用的示例数据,SQL Fiddle
有什么建议吗?谢谢
首先需要不同区域与不同条件的CROSS联接,然后需要表的LEFT联接:
SELECT t1.condition, t2.area,
COUNT(k.nrp) AS count_conditions
FROM (SELECT DISTINCT `condition` FROM tb_attended) t1
CROSS JOIN (SELECT DISTINCT Area FROM tb_employees) t2
LEFT JOIN tb_attended a ON a.condition = t1.condition
LEFT JOIN tb_employees k ON k.area = t2.area AND a.nrp = k.nrp AND a.date = '2020-07-20'
GROUP BY t1.condition, t2.area
ORDER BY t2.area, t1.condition DESC
请参阅演示。
使用左联接
SELECT a.conditions, k.area,
SUM(CASE WHEN a.conditions IS NOT NULL THEN 1 ELSE 0 END) AS count_conditions
FROM tb_attended a
left JOIN tb_employees k
ON a.nrp = k.nrp
AND a.date = '2020-07-20'
GROUP BY k.area, a.conditions
您可以在没有冗余条件语句的情况下使用LEFT JOIN
,使用SUM()
聚合:
SELECT a.conditions, k.area,
SUM(a.conditions IS NOT NULL) AS count_conditions
FROM tb_attended a
LEFT JOIN tb_employees k
ON a.nrp = k.nrp
AND a.date = '2020-07-20'
GROUP BY k.area, a.conditions
我想你想要一个left join
:
SELECT a.conditions, k.area, COUNT(a.conditions) AS count_conditions
FROM tb_employees k LEFT JOIN
tb_attended a
ON a.nrp = k.nrp AND a.date = '2020-07-20'
GROUP BY k.area, a.conditions;
编辑:
我明白了。您希望获得所有行,即使是没有匹配项的行。使用CROSS JOIN
生成所需区域和条件的组合。然后使用LEFT JOIN
匹配现有数据:
SELECT c.condition, e.area, COUNT(a.nrp) AS count_conditions
FROM (SELECT DISTINCT a.condition
FROM tb_attended a
) c CROSS JOIN
(SELECT DISTINCT area
FROM tb_employees
) e LEFT JOIN
tb_employees k
ON k.area = e.area LEFT JOIN
tb_attended a
ON a.nrp = k.nrp AND
a.condition = c.condition AND
a.date = '2020-07-20'
GROUP BY c.condition, e.area;
这里有一个db<gt;不停摆弄