簡體   English   中英

跨多個表的MYSQL計數查詢

[英]MYSQL Count Query across multiple tables

我需要根據四個表中的數據生成一個結果表。

這些表格是“用戶”,“部門”,“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

@peterm要求的SQL小提琴:

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

編輯2

剛剛意識到; 如果某個部門沒有值,那么@ Meherzad的答案將無法完全發揮作用,因此它不會列出它們。 對不起,如果從最初的問題中不清楚,但我需要顯示空值。

編輯3 - 答案 @ Meherzad 答案的改編和我的初始查詢產生了正確的結果。 感謝@Meherzad。 這是最新的SQL小提琴: http ://sqlfiddle.com/#! 2/73015/1

試試這個查詢

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

我不認為這是最好的解決方案,但這是最明顯的解決方案。 只需為所有部門添加全零的查詢。 采用@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM