У меня проблема с этим условным подсчетом, и я застрял здесь на один день! Надеюсь найти решение здесь от вас всех. Итак, у меня есть таблица оценок, которая состоит из трех столбцов: 1. основной предмет 2. предмет (это разбивка общего предмета) 3. класс
Grand_subject Subject Grade
-------------------------------------------------------
Discrete Math Discrete Math 1 A
B
B
A
A
B
------------------------------------------------------
Statistics Statistics 1 A
B
B
A
A
-------------------------------------------------------
Physics Physics Basic A
A
A
B
----------------------------------
Physics 1 B
B
B
A
----------------------------------
Physics 2 A
A
B
-------------------------------------------------------
History History 1 B
A
A
B
----------------------------------
History 2 A
A
B
B
Итак, я пытаюсь сделать следующее: я собираюсь посчитать процент оценки A в списке для grand_subject и каждого предмета {процент оценки = количество A, деленное на количество оценок A плюс B (сколько A / (сколько A + сколько B) * 100 %}. Применяются два правила: 1). Для этих двух больших предметов: Дискретная математика и статистика, вычисление оценки должно быть объединено как Математика ; однако для другие великие предметы будут учитываться индивидуально (физика, история) 2). Для столбца предметов вычисление оценки должно быть выполнено индивидуально для каждого предмета.
Ожидаемый результат показан ниже:
A_Grade_Percentage
-----------------------------------------------------------------
Maths (Discrete Math + Statistics) 54.50%
Discrete Math 1 50%
Statistics 1 60%
-----------------------------------------------------------------
Physics 54.50%
Physics Basic 75%
Physics 1 25%
Physics 2 66.70%
-----------------------------------------------------------------
History 50%
History 1 50%
History 2 50%
-----------------------------------------------------------------
Geography 25%
Пока я пробовал этот длинный код:
with on_grand_subject as(
select
case when grand_subject in ('Discrete Math', 'Statistics') then 'Maths'
else grand_subject end as grand_subject,
count(case when grade = 'A' then 1 else 0 end) as A_Grade,
100.0*count(case when grade = 'A' then 1 else 0 end) /
(count(case when grade = 'A' then 1 else 0 end) + count(case when grade = 'B' then 1 else 0 end))
as A_Grade_percentage,
from
grade_table
where
...................
group by grand_subject in ('Discrete Math', 'Statistics') then 'Maths' else grand_subject end
order by grand_subject
limit 1000
),
on_subject as(
select
grand_subject,
subject,
count(case when grade = 'A' then 1 else 0 end) as A_Grade,
100.0*count(case when grade = 'A' then 1 else 0 end) /
(count(case when grade = 'A' then 1 else 0 end) + count(case when grade = 'B' then 1 else 0 end))
as A_Grade_percentage,
from
grade_table
where
...................
group by grand_subject, subject
order by subject
limit 1000
)
select
g.grand_subject, s.subject, g.A_Grade, g.A_Grade_percentage, s.A_Grade, g.A_Grade_percentage
from on_grand_subject g join on_subject s on g.grand_subject = s.grand_subject
Но вывод выглядит странно, а не то, что он должен был быть. Есть ли какие-то решения для этого? Большое спасибо!