Условное агрегирование - возможный подход:
SELECT s.survey_ID
, SUM(1) AS total
, SUM(s.question1 > 3) AS newTotal
FROM survey_Table s
WHERE s.courseName IN ('GENE01','GENE02','GENE03','GENE04')
GROUP
BY s.survey_ID
WITH ROLLUP
Обратите внимание, что условие s.question1 > 3
является сокращением MySQL. MySQL оценивает это и возвращает 1 для TRUE, возвращает 0 для FALSE и NULL, если его ноль.
Это почти эквивалентно более портативному стандарту ANSI:
SUM(CASE WHEN s.question1 > 3 THEN 1 ELSE 0 END) AS newTotal
Существует разница в обработке значений NULL.
Более точная перезапись SUM(s.question1 > 3)
будет
SUM(CASE WHEN s.question1 > 3 THEN 1 WHEN s.question1 IS NULL THEN NULL ELSE 0 END)
Для каждой возвращаемой строки вычисляется выражение внутри агрегата SUM()
. 1
всегда оценивается как 1
.
Не стесняйтесь опускать survey_ID
из списка SELECT. Обычно, когда мы делаем GROUP BY foo
, нас интересует, какая строка результатов связана с какой foo
.
Вопрос задает вопрос о получении «процента». Мы можем выполнить деление в выражении в списке SELECT
. Но я не думаю, что "with rollup
" даст вам то, что вы ожидаете.
Вот пример:
SELECT SUM(1) AS total
, SUM(s.question1 > 3) AS newTotal
, 100.0
* SUM(s.question1 > 3)
/ SUM(1) AS percentage
FROM survey_Table s
WHERE s.courseName IN ('GENE01','GENE02','GENE03','GENE04')
В этом примере я решил опустить предложение GROUP BY
. Таким образом, это вернет одну общую итоговую строку, которая даст нам общий процент. (Если бы мы использовали GROUP BY
и WITH ROLLUP
, процент был бы добавлен. И, вероятно, это не тот результат, которого мы добиваемся.)