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