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 более одного раза, как только у ученика будет несколько разных классов.

Другие вопросы по тегам