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.

Что я пробовал :

  1. Добавить tb.status в GROUP BY внутри подзапроса, то ошибка не уйдет
  2. Добавить tb.status в GROUP BYто получим результат на скриншоте ниже, что не соответствует требованиям
  3. Убрать GROUP BY из основного запроса и вынести u.FullName в подзапрос вместе с GROUP BY (SELECT u.FullName GROUP BY tb.Executor) - не сработало
  4. Как и 3-ий пункт, только заместо GROUP BY - DISTINCT т.е. (SELECT DISTINCT u.FullName)

Дубликаты при добавлении tb.status в GROUP BY

Вопрос :

Как работать с GROUP BY и с подзапросами, что бы составить запрос из раздела 'Суть'


Ответы (1 шт):

Автор решения: velial

Когда нужно подсчитать количество строк, но не всех, а только попадающих под некоторое условие, бывает достаточно замены оператора 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
→ Ссылка