【问题标题】:How to select a record with looping condition in SQL如何在 SQL 中选择具有循环条件的记录
【发布时间】:2021-04-24 21:53:01
【问题描述】:

我有一张桌子,上面有一组任务,如下所示。我想知道哪个 WOID 已完成所有工作任务(T01、T02、T03)以及任何未完成的管理任务(T04、T05),这意味着任务 T01、T02 和 T02 必须处于完成状态,并且要么任务 T04 或 T05 处于未完成状态。我的查询将返回结果 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 sql-server tsql sql-server-2012 subquery


    【解决方案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;
      

      这两个都假设您没有重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-26
        • 2017-12-09
        • 1970-01-01
        • 2021-08-23
        • 2023-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多