GROUP BY и подзапросы
Суть:
Задача собрать статистику по задачам и в каждый столбец собрать количество задач определенного типа
Группировка задач по пользователю
SELECT
u.FullName,
(SELECT COUNT(tb.id)) as 'TaskSum',
(SELECT COUNT(tb.id) WHERE tb.[Status] in ({#EnumSQL.TaskBaseStatus.Incomplete}) GROUP BY tb.[Status]) as 'TaskOverdue'
--TODO: More types
FROM TaskBase as tb
INNER JOIN [User] as u ON u.Id = tb.Executor
WHERE u.Status = 0 AND (tb.IsEmulation IS NULL OR tb.IsEmulation = 0)
GROUP BY tb.Executor, u.FullName
ORDER BY FullName asc
Проблема:
При добавлении статуса в подзапросы, то он требуется в GROUP BY или агрегатной функции т.е.
Столбец "TaskBase.Status" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Что я пробовал :
- Добавить
tb.statusвGROUP BYвнутри подзапроса, то ошибка не уйдет - Добавить
tb.statusвGROUP BYто получим результат на скриншоте ниже, что не соответствует требованиям - Убрать
GROUP BYиз основного запроса и вынестиu.FullNameв подзапрос вместе сGROUP BY(SELECT u.FullName GROUP BY tb.Executor) - не сработало - Как и 3-ий пункт, только заместо
GROUP BY-DISTINCTт.е.(SELECT DISTINCT u.FullName)
Вопрос :
Как работать с GROUP BY и с подзапросами, что бы составить запрос из раздела 'Суть'
Ответы (1 шт):
Когда нужно подсчитать количество строк, но не всех, а только попадающих под некоторое условие, бывает достаточно замены оператора COUNT на оператор SUM по следующему шаблону:
-- COUNT(*)
SUM(CASE WHEN <условие> THEN 1 ELSE 0 END)
Соответственно, в Вашем случае запрос примет такой вид:
SELECT
u.FullName,
COUNT(tb.id) as 'TaskSum',
SUM(CASE WHEN tb.[Status] in ({#EnumSQL.TaskBaseStatus.Incomplete}) THEN 1 ELSE 0 END) as 'TaskOverdue'
-- TODO: More types
FROM TaskBase as tb
INNER JOIN [User] as u ON u.Id = tb.Executor
WHERE u.Status = 0 AND (tb.IsEmulation IS NULL OR tb.IsEmulation = 0)
GROUP BY tb.Executor, u.FullName
ORDER BY FullName asc
