如何在 SQL 中 select 具有循环条件的记录
How to select a record with looping condition in SQL
我有一个 table 任务集如下。我想找出哪个 WOID 已完成所有工作任务(T01、T02、T03)和任何未完成的管理任务(T04、T05),这意味着任务 T01、T02 和 T02 必须处于完成状态,或者任务 T04 或 T05 处于未完成状态。我的查询将 return 结果为 WOID W02,因为它符合条件。我很难在查询中包含上述逻辑。
Task ID
Status
WOID
T01
Complete
W01
T02
Pending
W01
T03
Complete
W01
T04
Pending
W01
T05
Pending
W01
T01
Complete
W02
T02
Complete
W02
T03
Complete
W02
T04
Complete
W02
T05
Pending
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>
当然你不想在这里循环,你正在写 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;
I would like to find out which WOID has all the work tasks completed ( T01,T02,T03) and with any of the admin tasks not completed( 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;
这两个假设您没有重复项。
我有一个 table 任务集如下。我想找出哪个 WOID 已完成所有工作任务(T01、T02、T03)和任何未完成的管理任务(T04、T05),这意味着任务 T01、T02 和 T02 必须处于完成状态,或者任务 T04 或 T05 处于未完成状态。我的查询将 return 结果为 WOID W02,因为它符合条件。我很难在查询中包含上述逻辑。
Task ID | Status | WOID |
---|---|---|
T01 | Complete | W01 |
T02 | Pending | W01 |
T03 | Complete | W01 |
T04 | Pending | W01 |
T05 | Pending | W01 |
T01 | Complete | W02 |
T02 | Complete | W02 |
T03 | Complete | W02 |
T04 | Complete | W02 |
T05 | Pending | 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>
当然你不想在这里循环,你正在写 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;
I would like to find out which WOID has all the work tasks completed ( T01,T02,T03) and with any of the admin tasks not completed( 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;
这两个假设您没有重复项。