Как выбрать запись с условием цикла в SQL

#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;
 

Оба они предполагают, что у вас нет дубликатов.