0

4 つのテーブルのデータに基づいて結果のテーブルを作成する必要があります。

これらのテーブルは、'users'、'departments'、'report_info'、'report_eval' です。基本的に、ユーザーに関するレポートが作成され、レポートに関するいくつかの基本情報とともに「report_info」に保存されます。

レポート情報:

report_id
uid
report_date
report_title
...

ユーザーレポートが評価されると、「report_eval」に保存されます

report_eval:

id
report_id
report
grade

レポートの評点は、A、B、C、D の 4 文字のいずれかです。

各ユーザーは部門に属しています。ユーザーのテーブルは次のようになります。

ユーザー:

uid
forename
surname
dept_id
...

部門テーブルは次のようになります。

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 Fiddle:

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

編集2

気づいた。部門に値がない場合、@ Meherzadの回答は完全には機能せず、それらはリストされません。これが最初の質問から明確でない場合は申し訳ありませんが、null 値を表示する必要があります。

編集 3 - 回答 @ Meherzad の回答と私の最初のクエリの適応により、正しい結果が得られました。@Meherzadの功績。これが最新の SQL Fiddle です: http://sqlfiddle.com/#!2/73015/1

4

2 に答える 2

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
于 2013-06-05T09:09:30.867 に答える