SQL查询根据if列没有0,每个订单只返回1条记录

时间:2016-04-20 17:51:34

标签: mysql sql

我已经使用这个网站好几个月了,它非常有帮助。然而,我终于遇到了一个问题,我一直无法找到如何做的答案。

我的表中大约有30列,但我只对其中的7列感兴趣。我试图完成的是一个查询,它将返回每个订单的第一个和最后一个选择的日期/时间,但仅适用于已完成的订单。

我的表看起来像这样:

    ordnum | adddte          |pckdte            |pckqty |appqty | srcloc | ctnnum
-----------+-----------------+------------------+-------+-------+--------+------
    ORD123 | 4/20/16 6:31 AM | Null             | 1     | 0     |  375   |  CTN1
    ORD123 | 4/20/16 6:31 AM | 4/20/16 11:39 AM | 2     | 2     |  335   |  NULL
    ORD123 | 4/20/16 6:31 AM | 4/20/16 11:37 AM | 1     | 1     |  336   |  CTN1

    ORD456 | 4/20/16 7:11 AM | 4/20/16 11:59 AM | 3     | 3     |  376   |  CTN2
    ORD456 | 4/20/16 7:11 AM | 4/20/16 11:47 AM | 1     | 1     |  345   |  CTN2
    ORD456 | 4/20/16 7:11 AM | 4/20/16 11:07 AM | 4     | 4     |  355   |  CTN2

请注意判断订单是否完整的唯一方法是每个订单的值都大于0.其pckdte可以为null,订单仍然可以参与竞争。

以下是我目前正在使用的代码,该代码确实给出了每个订单的开始和停止时间,但也包括尚未完成的订单。

SELECT 
      ordnum
      ,max(pckdte) AS "Last Pick"
      ,min(pckdte) AS "First Pick"
  FROM MyTable
  Where (adddte >= '2016-04-02 00:00:00' AND  pckdte <= '2016-04-20 23:59:59')

 and ctnnum like 'c%'
 and (srcloc like '2%' or srcloc like '3%' or srcloc like '4%' or srcloc like '5%' or srcloc like '1%')
group by ordnum
order by ordnum

代码给了我这些结果:

    ordnum  | Last Pick        |   First Pick
------------+------------------+----------------
    ORD123  | 4/20/16 11:39 AM | 4/20/16 11:37 AM
    ORD456  | 4/20/16 11:59 AM | 4/20/16 11:07 AM

但是我不想包含ORD123,因为还有一个未完成的选择(appqty = 0)。需要列adddte,srcloc和ctnnum来将我的部门的订单与其他人的订单分开,因为它们都存储在同一个表中,而我的where语句中列出的参数是过滤我部门工作的唯一方法。

对此问题的任何帮助将不胜感激。如果我需要提供更多信息,请告诉我。

3 个答案:

答案 0 :(得分:2)

子查询应该有效:

AND ordnum not in (SELECT ordnum FROM MyTable WHERE appqty = 0)

这将过滤掉至少有一行ordnum appqty的所有0

完整查询:

SELECT 
      ordnum
      ,max(pckdte) AS "Last Pick"
      ,min(pckdte) AS "First Pick"
  FROM MyTable
  Where (adddte >= '2016-04-02 00:00:00' AND  pckdte <= '2016-04-20 23:59:59')

 and ctnnum like 'c%'
 and (srcloc like '2%' or srcloc like '3%' or srcloc like '4%' or srcloc like '5%' or srcloc like '1%')
 AND ordnum not in (SELECT ordnum FROM MyTable WHERE appqty = 0)
group by ordnum
order by ordnum

答案 1 :(得分:2)

添加一行以检查确保ordnum的appqty = 0不存在

SELECT 
      ordnum
      ,max(pckdte) AS "Last Pick"
      ,min(pckdte) AS "First Pick"
  FROM MyTable
  Where (adddte >= '2016-04-02 00:00:00' AND  pckdte <= '2016-04-20 23:59:59')
 and ctnnum like 'c%'
 and (srcloc like '2%' or srcloc like '3%' or srcloc like '4%' or srcloc like '5%' or srcloc like '1%')
 -- line below added
 AND NOT EXISTS (SELECT 1 FROM MyTable T2 WHERE appqty = 0 AND T2.ordnum = MyTable.ordnum)      
group by ordnum
order by ordnum

答案 2 :(得分:0)

我认为您应该通过将列Min(appqty)添加为MAPPQTY来创建视图 然后使用MAPQTY&gt; 0

进行过滤

将解决您的问题