Я пытаюсь сделать некоторые отчеты с помощью SQL, но у меня проблемы с подсчетом в одной строке нескольких разных состояний профессионалом.
Вот образец данных:
Я пытаюсь показать что-то вроде этого, но ТОЛЬКО последнее состояние встречи:
Я попытался сделать запрос, который подсчитывает только встречи с NULL date_end (нашел его на этом сайте), например:
SELECT DISTINCT prof.surname,
SUM(CASE WHEN state_type.name = 'scheduled' THEN 1 ELSE 0 END) AS total_scheduled,
SUM(CASE WHEN state_type.name = 'attended' THEN 1 ELSE 0 END) AS total_attended,
SUM(CASE WHEN state_type.name = 'waiting' THEN 1 ELSE 0 END) AS total_waiting,
SUM(CASE WHEN state_type.name = 'canceled' THEN 1 ELSE 0 END) AS total_canceled
FROM (appointment, appointment_state, prof, state_type, etc.)
WHERE appointment_state.final_date IS NULL
(я знаю, что мне не нужно включать таблицу state_type, но она предназначена для демонстрации примера)
Проблема в том, что этот запрос по-прежнему подсчитывает все состояния от встречи x, независимо от оператора WHERE:
Есть ли у вас какие-либо идеи или как мне структурировать запрос?
Извините, если что-то не так, пишу сюда впервые :)
Да, я использую удобные JOINS в части FROM, приведенный выше код является просто примером.
Вы начинаете с того, что говорите, что у вас есть данные. Ну, это данные, которые должны быть агрегированы. Если это запрос, вы можете использовать CTE:
with data as (
<your query here>
)
SELECT prof.surname,
SUM(CASE WHEN name = 'scheduled' THEN 1 ELSE 0 END) AS total_scheduled,
SUM(CASE WHEN name = 'attended' THEN 1 ELSE 0 END) AS total_attended,
SUM(CASE WHEN name = 'waiting' THEN 1 ELSE 0 END) AS total_waiting,
SUM(CASE WHEN name = 'canceled' THEN 1 ELSE 0 END) AS total_canceled
FROM data
WHERE final_date IS NULL
GROUP BY surname
Да!! Спасибо! Я получил итоги легко с этим.
Никогда не используйте запятые в предложении
FROM
. Всегда используйте правильный, явный, стандартный, читаемый синтаксисJOIN
.