我需要根据四个表格中的数据生成一个结果表。
这些表格是“用户”,“部门”,“report_info”,“report_eval”。基本上会创建一个关于用户的报告,并在“report_info”中存储有关报告的一些基本信息,例如:
report_info:
report_id
uid
report_date
report_title
...
评估用户报告时,会将其保存在“report_eval”
中report_eval:
id
report_id
report
grade
报告的成绩可以是四个字母A,B,C,D之一
每个用户都属于某个部门。用户的表格如下所示:
用户:
uid
forename
surname
dept_id
...
department表看起来像这样:
dept_id
dept_name
我需要生成一个结果列表,显示每个级别所有部门的每个级别的金额等级。一个例子是:
Department | A | B | C | D
----------------------------
Finance | 0 | 1 | 0 | 3
Sales | 6 | 2 | 3 | 1
Admin | 0 | 0 | 0 | 0
...
等
到目前为止,我的查询如下,但没有给出所需的结果:
SELECT
d.dept_id,
d.dept_name,
COUNT(NULLIF(re.grade, 'A')) AS gradeA,
COUNT(NULLIF(re.grade, 'B')) AS gradeB,
COUNT(NULLIF(re.grade, 'C')) AS gradeC,
COUNT(NULLIF(re.grade, 'D')) AS gradeD
FROM report_eval re
JOIN report_info ri ON ri.report_id=re.report_id
JOIN users u ON u.uid=ri.uid
RIGHT JOIN departments d ON d.dept_id=u.uid
GROUP BY d.dept_id
我的查询会导致列出所有部门,但是,所有成绩计数都设置为零。
希望这一切都有意义。任何人都可以调整我的查询,指出我正确的方向。
非常感谢所有帮助。提前谢谢。
编辑1
@fterm请求的SQL小提琴:
http://sqlfiddle.com/#!2/c1f81/2
编辑2
刚刚意识到;如果某个部门没有值,那么@ Meherzad的答案将无法完全发挥作用,因此它不会列出它们。对不起,如果初始问题不清楚,但我需要显示空值。
编辑3 - 回答 @ Meherzad的答案和我的初始查询的适应产生了正确的结果。感谢@Meherzad。这是最新的SQL小提琴:http://sqlfiddle.com/#!2/73015/1
答案 0 :(得分:2)
尝试此查询
SELECT
d.dept_Name,
sum(if(re.grade='A', 1, 0)) as 'A',
sum(if(re.grade='B', 1, 0)) as 'B',
sum(if(re.grade='C', 1, 0)) as 'C',
sum(if(re.grade='D', 1, 0)) as 'D'
FROM
dept d
INNER JOIN
users u
ON
u.dept_id=d.dept_id
INNER JOIN
report_info ri
ON
ri.uid=u.uid
INNER JOIN
report_eval re
ON
re.report_id=ri.report_id
GROUP BY
d.dept_Name
答案 1 :(得分:0)
我不认为这是最好的解决方案,但这是最明显的解决方案。只需为所有部门添加全零的查询。采用@Meherzad查询,应该是这样的:
SELECT res.dept_Name, SUM(res.A) as 'A', SUM(res.B) as 'B', SUM(res.C) as 'C', SUM(res.D) as 'D'
FROM
(SELECT dept_Name, 0 As 'A', 0 As 'B', 0 As 'C', 0 As 'D'
FROM departments
UNION ALL
(SELECT
d.dept_Name,
sum(if(re.grade='A', 1, 0)) as 'A',
sum(if(re.grade='B', 1, 0)) as 'B',
sum(if(re.grade='C', 1, 0)) as 'C',
sum(if(re.grade='D', 1, 0)) as 'D'
FROM
departments d
INNER JOIN
users u
ON
u.dept_id=d.dept_id
INNER JOIN
report_info ri
ON
ri.uid=u.uid
INNER JOIN
report_eval re
ON
re.report_id=ri.report_id
GROUP BY
d.dept_Name)) res
GROUP BY res.dept_name