我已经使用这个网站好几个月了,它非常有帮助。然而,我终于遇到了一个问题,我一直无法找到如何做的答案。
我的表中大约有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语句中列出的参数是过滤我部门工作的唯一方法。
对此问题的任何帮助将不胜感激。如果我需要提供更多信息,请告诉我。
答案 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
进行过滤将解决您的问题