SQL и подсчет
У меня есть таблица, которая состоит из следующих
Student Name Grade Class
--------------------------------------------------------
User 1 A English
User 1 B Math
User 2 B Math
Я пытаюсь создать запрос, в котором будут перечислены все учащиеся, общее количество баллов (оценки A,B и C), общее количество баллов A, общее количество баллов B, общее количество баллов C
Может ли кто-нибудь помочь мне создать запрос или, по крайней мере, направить меня в правильном направлении?
4 ответа
Попробуйте это:
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
Вот скрипка.
Вы должны использовать 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
Этот пример предназначен для SQL Server (см. Здесь sqlfiddle), но другие СУБД имеют аналогичные возможности.
Еще один возможный ответ (очень длинный, но очевидный):
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
Вот решение в Access SQL, в двух отдельных запросах:
Общее количество баллов за одного учащегося:
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;
Если вам действительно нужен только один запрос, самый простой способ сделать это - сохранить оба запроса как запросы Access и присоединить их к StudentName. Тем не менее, вы получите NumberOfPassGrades более одного раза, как только у ученика будет несколько разных классов.