Mysql 基于if列不包含0的每个订单仅返回1条记录的SQL查询

Mysql 基于if列不包含0的每个订单仅返回1条记录的SQL查询,mysql,sql,Mysql,Sql,我已经使用这个网站好几个月了,它非常有用。然而,我终于遇到了一个我一直无法找到答案的问题 我的表格大约有30列,但我只对其中的7列感兴趣。我试图完成的是一个查询,它将返回每个订单的第一个和最后一个选择的日期/时间,但仅针对已完成的订单 我的桌子看起来像这样: ordnum | adddte |pckdte |pckqty |appqty | srcloc | ctnnum -----------+-----------------+--------

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

我的表格大约有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
请注意,判断订单是否完成的唯一方法是其每个appqty的值都大于0。其pckdte可以为空,且订单仍处于竞争状态

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

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
但是,我不想包括ORD123,因为仍然有一个未完成的拾取(appqty=0)。adddte、srcloc和ctnnum列需要将我部门的订单与其他所有订单分开,因为它们都存储在同一个表中,而where语句中列出的参数是筛选我部门工作的唯一方法

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

子查询应该可以工作:

AND ordnum not in (SELECT ordnum FROM MyTable WHERE appqty = 0)
这将过滤掉至少有一行
appqty
0
的所有
ordnum

完整查询:

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
选择
奥德纳姆
,最大值(pckdte)为“最后一次拾取”
,min(pckdte)作为“首选”
从MyTable

其中(adddte>='2016-04-02 00:00:00'和pckdte添加一行以检查并确保ordnum的AppQuantity=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
选择
奥德纳姆
,最大值(pckdte)为“最后一次拾取”
,min(pckdte)作为“首选”
从MyTable

其中(adddte>='2016-04-02 00:00:00'和pckdte我认为您应该创建一个视图,将列Min(appqty)添加为MAPPQTY 然后使用MAPQTY>0进行筛选


将解决您的问题

在分组后添加一个具有总和的
(appqty=0)=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