-2

私は以下からなるテーブルを持っています

Student Name        Grade       Class
--------------------------------------------------------
User 1              A           English
User 1              B           Math
User 2              B           Math

すべての学生、合計合格点(グレードA、B、C)、合計A、合計B、合計Cを一覧表示するクエリを作成しようとしています。

誰かが私がクエリを作成するのを手伝ってくれるか、少なくとも私を正しい方向に向かわせることができますか?

4

4 に答える 4

3

sumの代わりにcountを使用し、次のように内部で条件式を使用する必要があります。

select
  sum(case when grade in ('A','B','C') then 1 else 0 end) as passing
, sum(case when grade = 'A' then 1 else 0 end) as NumA
, sum(case when grade = 'B' then 1 else 0 end) as NumB
, sum(case when grade = 'C' then 1 else 0 end) as NumC
from grades

この例はSQLServer用です(ここではsqlfiddleを参照)が、他のRDBMSにも同様の機能があります。

于 2012-04-20T04:08:13.853 に答える
3

これを試してみてください:

select name,
    count(case when grade in ('A', 'B', 'C') then 1 end) totalPass,
    count(case when grade = 'A' then 1 end) totalA,
    count(case when grade = 'B' then 1 end) totalB,
    count(case when grade = 'C' then 1 end) totalC
from t
group by name

これがフィドルです。

または、MySQLを使用している場合は、さらに簡単にすることができます。

select name,
    sum(grade in ('A', 'B', 'C')) totalPass,
    sum(grade = 'A') totalA,
    sum(grade = 'B') totalB,
    sum(grade = 'C') totalC
from t
group by name

これがフィドルです。

于 2012-04-20T04:08:39.177 に答える
0

さらに別の可能な答え(非常に長いが自明):

select u.UserName 
,totalA = count(a.Grade) 
,totalB = count(b.Grade) 
,totalC = count(c.Grade) 
,totalPass = count(p.Grade) 
from
GradeUser u
LEFT JOIN GradeUser a on a.UserName = u.UserName
 AND a.Grade = u.Grade AND a.Class = u.Class
 AND a.Grade ='A'
LEFT JOIN GradeUser b on b.UserName = u.UserName
 AND b.Grade = u.Grade AND b.Class = u.Class
 AND b.Grade ='B'
LEFT JOIN GradeUser c on c.UserName = u.UserName
 AND c.Grade = u.Grade AND c.Class = u.Class
 AND c.Grade ='C'
LEFT JOIN GradeUser p on p.UserName = u.UserName
 AND p.Grade = u.Grade AND p.Class = u.Class
 AND p.Grade IN ('A', 'B', 'C')
GROUP BY u.UserName
于 2012-04-20T04:26:13.037 に答える
0

これは、2つの別々のクエリでのAccessSQLのソリューションです。

学生1人あたりの合計合格点数:

SELECT grades.StudentName, Count(grades.Grade) AS NumberOfPassGrades
FROM grades
WHERE (((grades.Grade) In ('A','B','C')))
GROUP BY grades.StudentName
ORDER BY grades.StudentName;

合計A、合計B、合計Cの数:

SELECT grades.StudentName, grades.Grade, Count(grades.Grade) AS NumberOfGrades
FROM grades
GROUP BY grades.StudentName, grades.Grade
ORDER BY grades.StudentName, grades.Grade;

本当に1つのクエリだけが必要な場合、これを行う最も簡単な方法は、両方のクエリをAccessクエリとして保存し、StudentNameに結合することです。ただし、生徒が複数の異なる成績を取得するとすぐに、NumberOfPassGradesを複数回取得します。

于 2012-04-20T05:20:57.193 に答える