【问题标题】:SQL Selecting finished orders with multiple operationsSQL选择具有多个操作的已完成订单
【发布时间】:2009-08-05 16:29:16
【问题描述】:

我有一个带有子操作的订单列表。如何创建已完成订单的列表?完成的订单必须完成所有子操作。

表“订单”:

order_no | suboperation | finished
1        | preparing    | 01/01/2009
1        | scrubbing    | 01/05/2009
1        | painting     | 01/10/2009
2        | preparing    | 02/05/09
2        | painting     | NULL
3        | preparing    | 03/01/2009
3        | scrubbing    | 03/15/2009
3        | painting     | 03/10/2009
4        | bending      | NULL
4        | crashing     | NULL
4        | staining     | NULL
4        | painting     | NULL

期望的输出(完成的订单):

order_no
1
3

【问题讨论】:

    标签: sql ms-access select jet


    【解决方案1】:

    您还可以使用 countgroup byhave。这避免了必须进行任何更有效的表连接。

    create table #Orders (
        order_no int,
        suboperation varchar(30),
        finished smalldatetime)
    
    insert into #Orders values (1 , 'preparing' , '01/01/2009')
    insert into #Orders values (1 , 'scrubbing' , '01/05/2009')
    insert into #Orders values (1 , 'painting' , '01/10/2009')
    insert into #Orders values (2 , 'preparing' , '02/05/09')
    insert into #Orders values (2 , 'painting' , NULL)
    insert into #Orders values (3 , 'preparing' , '03/01/2009')
    insert into #Orders values (3 , 'scrubbing' , '03/15/2009')
    insert into #Orders values (3 , 'painting' , '03/10/2009')
    insert into #Orders values (4 , 'bending' , NULL)
    insert into #Orders values (4 , 'crashing' , NULL)
    insert into #Orders values (4 , 'staining' , NULL)
    insert into #Orders values (4 , 'painting' , NULL)
    
    select 
        order_no, 
        count(1) As NoOfSubtasks --count(1) gives the number of rows in the group
        count(finished) As NoFinished, --count will not count nulls
    from #Stuff
    group by 
         order_no
    having 
        count(finished) = count(1) --if finished = number of tasks then it's complete
    
    drop table #Orders
    

    【讨论】:

      【解决方案2】:

      一个好的 ol'WHERE NOT EXISTS 子句应该在这里工作:

      SELECT DISTINCT o.order_no
      FROM orders o
      WHERE NOT EXISTS (SELECT p.order_no
                        FROM orders p
                        WHERE p.order_no = o.order_no 
                        AND p.finished IS NULL)
      

      【讨论】:

      • 这将重复订单号。您可以通过使其 SELECT distinct o.order_no 来解决此问题
      • @pjp - 感谢您发现这一点。
      【解决方案3】:

      我试图找到一种使用 MIN 函数的方法,并想出了这个:

      选择订单号

      来自订单

      按订单编号分组

      HAVING (MIN(ISNULL(finished, 0)) 0)

      null 可能很烦人...

      也许没有那么高效,但对我来说更容易理解。

      【讨论】:

      • 这个看起来也不错,但我不得不为 Access 更改它。 SELECT order_no FROM Orders GROUP BY order_no HAVING (MIN(ISNULL(finished)) = 0);
      【解决方案4】:
      SELECT order_no, suboperation, finished
      FROM orders o1
      WHERE NOT EXISTS(
          SELECT 1 
              FROM orders o2 
              WHERE o1.order_no = o2.order_no 
              AND o2 IS NULL )
      

      【讨论】:

      • fix 'AND o2.finished IS NULL' 这也为每个子任务返回一行。
      • IS NULL 选择所有未平仓订单,这就是为什么这个构造由 NOT EXISTS 构成的原因
      猜你喜欢
      • 1970-01-01
      • 2014-02-17
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      相关资源
      最近更新 更多