2013-06-05 92 views
0

我需要根据四个表中的数据生成结果表。MYSQL计数跨多个表的查询

这些表是 '用户', '部门', '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 

我的查询结果被列,但是,所有等级计数都设置为零。

希望这一切是很有意义的。任何人都可以调整我的查询,让我指向正确的方向。

非常感谢所有帮助。提前致谢。

EDIT 1

SQL小提琴由@peterm的要求:

http://sqlfiddle.com/#!2/c1f81/2

编辑2

刚刚意识到; @ Meherzad的答案不能完全工作,如果没有一个部门的价值,那么它没有列出他们。对不起,如果这不是最初的问题,但我需要显示空值。

编辑3 - 答 的@ Meherzad的回答和我最初的查询产生正确的结果的适应。感谢@Meherzad。下面是最新的SQL小提琴:http://sqlfiddle.com/#!2/73015/1

+2

你可以发布所有表格的样本数据,最好是以sqlfiddle的形式? – peterm

回答

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 
+0

这起作用。下面是SQL小提琴:http://sqlfiddle.com/#!2/c1f81/2 – amburnside

+0

刚刚意识到这一点,如果没有值一个部门那么它不会列出它们不起作用。对不起,如果这不是最初的问题,但我需要显示空值。 – amburnside

+0

我已经修改了你的SQL查询,我原来它合并 - Baiscally我需要做右连接的部门,使各部门列出,即使他们没有对他们的报告。下面是一个更新的小提琴:http://sqlfiddle.com/#!2/73015/1 – amburnside

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