#sql #sql-server #tsql #sql-server-2012 #subquery
#sql #sql-сервер #tsql #sql-server-2012 #подзапрос
Вопрос:
У меня есть таблица с набором задач, как показано ниже. Я хотел бы выяснить, в каком WOID все рабочие задачи выполнены (T01, T02, T03) и ни одна из задач администратора не завершена (T04, T05), что означает, что задачи T01, T02 и T02 должны быть в завершенном состоянии, а задача T04 или T05 — в незавершенном состоянии. Мой запрос вернет результат WOID W02, поскольку он соответствует критериям. Мне трудно использовать вышеуказанную логику в моем запросе.
Идентификатор задачи | Статус | WOID |
---|---|---|
T01 | Завершить | W01 |
T02 | Ожидание | W01 |
T03 | Завершить | W01 |
T04 | Ожидание | W01 |
T05 | Ожидание | W01 |
T01 | Завершить | W02 |
T02 | Завершить | W02 |
T03 | Завершить | W02 |
T04 | Завершить | W02 |
T05 | Ожидание | W02 |
Сначала я попытался найти WOID со всеми выполненными задачами, а затем присоединиться к другому подзапросу, чтобы выяснить незавершенные задачи администратора, но не получил ожидаемых результатов. Любая помощь по этому вопросу была бы весьма признательна.
<code>
select a.WOID from
( select a.TASKID,a.WOID,a.STATUS,row_number()over
(partition by a.TASKSID order by a.TASKSID ,a.WOID,a.STATUS )rno from Task a
Left join Task b on a.TASKSID= b.TASKSID) a
where rno=1
and a.status='COMPLETE' and a.TASKSID not in ('T04','T05') </code>
Ответ №1:
Конечно, вы не хотите зацикливания здесь, вы пишете SQL. Похоже, вам нужна простая условная агрегация в HAVING
предложении:
SELECT WOID
FROM dbo.YourTable
GROUP BY WOID
HAVING COUNT(CASE WHEN TaskID IN ('T01','T02','T03') AND Status = 'Pending' THEN 1 END) = 0
AND COUNT(CASE WHEN TaskID IN ('T04','T05') AND Status = 'Pending' THEN 1 END) > 0;
Ответ №2:
Я хотел бы узнать, в каком WOID все рабочие задачи выполнены (T01, T02, T03) и ни одна из задач администратора не завершена (T04, T05)
Я бы выразил это как:
SELECT WOID
FROM dbo.YourTable
GROUP BY WOID
HAVING SUM(CASE WHEN TaskID IN ('T01', 'T02', 'T03') AND Status = 'Complete' THEN 1 ELSE 0 END) = 3 AND
SUM(CASE WHEN TaskID IN ('T04', 'T05') AND Status = 'Complete' THEN 1 ELSE 0 END) = 0;
Затем вы можете упростить это до:
SELECT WOID
FROM dbo.YourTable
WHERE Status = 'Complete'
GROUP BY WOID
HAVING SUM(CASE WHEN TaskID IN ('T01', 'T02', 'T03') THEN 1 ELSE 0 END) = 3 AND
SUM(CASE WHEN TaskID IN ('T04', 'T05') THEN 1 ELSE 0 END) = 0;
Оба они предполагают, что у вас нет дубликатов.