2

3 つのカテゴリに基づいて学生の成績を保持するテーブルがあります。カテゴリごとに 5 つの等級 (A、B、C、D、E) があるため、表は次のようになります。

id | cat1 | cat2 | cat3
1     A      B       A
2     D      C       D
3     B      A       E
4     C      B       D

成績をリストする2番目のテーブルがあります

grade
  A
  B
  C
  D
  E

このデータに対してクエリを実行して、各カテゴリで達成された成績の数を成績ごとにカウントできるようにする必要があります。このようなもの:

    Cat1 | Cat2 | Cat 3
A     1     1      1
B     1     2      0
C     1     1      0
D     1     0      2
E     0     0      1

次のクエリを実行しましたが、正しくないことはわかっていますが、予想に近い結果が得られています。

SELECT g.grade, COUNT( mb.cat1) , COUNT( mb.cat2) , COUNT( mb.cat3)
FROM markbook mb, grades g
WHERE g.grade = mb.cat1
GROUP BY g.grade
4

2 に答える 2

2

試す:

SELECT g.grade, 
       COUNT(case mb.cat1 when g.grade then 1 end), 
       COUNT(case mb.cat2 when g.grade then 1 end), 
       COUNT(case mb.cat3 when g.grade then 1 end)
FROM markbook mb
cross join grades g
GROUP BY g.grade

(SQLFiddleはこちら)

于 2013-03-27T16:04:21.247 に答える
2

回答が既に選択されていることはわかっていますが、これを行う方法は LEFT JOIN を使用することで、一致する成績がない場合でも表示されます。例は次のとおりです。

SELECT 

  g.grade,
  SUM(CASE mb.cat1 WHEN g.grade THEN 1 ELSE 0 END) AS cat1,
  SUM(CASE mb.cat2 WHEN g.grade THEN 1 ELSE 0 END) AS cat2,
  SUM(CASE mb.cat3 WHEN g.grade THEN 1 ELSE 0 END) AS cat3

FROM grades g
LEFT JOIN markbook mb 
    ON g.grade IN (mb.cat1,mb.cat2,mb.cat3)
GROUP BY g.grade;

(SQL フィドルの例、Mark Ba​​nnisters の回答から借用したスキーマ: http://sqlfiddle.com/#!2/9b863/1 )

于 2013-03-27T16:15:11.973 に答える