mysql - 将 LEFT JOIN 限制为最多一个结果

标签 mysql asp-classic

我正在尝试计算两次之间我们收到的订单数量,以及仓库工作人员已包装了多少订单。

我们有一个包含订单的“订单”表,当订单完成时,不幸的是,当它以取消订单等方式处理时,不应将其添加到计算中,它将收到“已完成” status 是太多我无法更改的遗留代码。

为了跟踪订单是否已打包,我想加入另一个名为“orders_sent”的表,但不幸的是,如果订单有多个包裹,则该表中将有多于一行的 order_id。

所以我想做的是检查订单是否已下达,如果订单已“完成”并且也存在于发送表中,我会将其计为已发送,如果它“完成”但不在发送表中,它应该被完全忽略,最后我想计算所有行的总数,忽略任何重复项,因为发送的表中有多个条目。

这是我到目前为止的想法。

"SELECT " &_
"   COUNT(CASE orders_status WHEN 'Finished' THEN 1 ELSE NULL END) AS Sent, " &_
"   COUNT(*) AS Total " &_
"FROM " &_
"   orders " &_
"   LEFT JOIN orders_sent ON orders_id = orders_sent_orderid " &_
"WHERE " &_
"   orders_date > '" & datetime & "' " &_
"   AND orders_date < '" & dateAdd("d",1,datetime) & "' " &_
"   AND NOT (" &_
"       orders_status = 'FINISHED' " &_
"       AND orders_sent_id IS NULL) "

我尝试对orders_sent_id进行分组,但这不起作用,因为发送表中不存在的所有订单都会分组在一起。尝试按 order_id 进行分组给了我奇怪的结果,我无法完全解释(已发送 6 个,总共 6 个)。如果不分组,我会发送 33 条,总共 54 条。

运行 SQL,跳过计数并仅显示orders_ID,使用下面的 SQL,我在该时间段内总共获得了 47 个订单。由于 order_sent 包含一些订单的多行,因此未分组会显示一些重复的 ID。

"SELECT " &_
"   orders_id AS oid " &_
"FROM " &_
"   orders " &_
"   LEFT JOIN orders_sent ON orders_id = orders_sent_orderid " &_
"WHERE " &_
"   orders_date > '" & datetime & "' " &_
"   AND orders_date < '" & dateAdd("d",1,datetime) & "' " &_
"   AND NOT (" &_
"       orders_status = 'Skickad och avslutad' " &_
"       AND orders_sent_id IS NULL) " &_
"GROUP BY " &_
"   orders_id"

那么我怎样才能去掉 JOIN 中的重复项,这样它们就不会弄乱总数?

最佳答案

根据 @P.Salmon 的评论,这是更正后的 SQL,它似乎解决了我的问题:

"SELECT " &_
"   COUNT(CASE WHEN orders_status = 'Finished' AND os.orders_sent_ts < '" & dateAdd("h",27,datetime) & "' THEN 1 ELSE NULL END) AS Sent, " &_
"   COUNT(*) AS Total " &_
"FROM " &_
"   orders " &_
"   LEFT JOIN (" &_
"       SELECT DISTINCT " &_
"           orders_sent_orderid, " &_
"           orders_sent_ts " &_
"       FROM " &_
"           orders_sent "&_
"       WHERE " &_
"           1) AS os ON orders_id = os.orders_sent_orderid " &_
"WHERE " &_
"   orders_date > '" & datetime & "' " &_
"   AND orders_date < '" & dateAdd("d",1,datetime) & "' " &_
"   AND NOT (" &_
"       orders_status = 'Finished' " &_
"       AND os.orders_sent_orderid IS NULL) "

我在我的 CASE 中的orders_sent 表中添加了一个时间戳来发送,以确保我可以返回到任何日期并查看当天的工作情况。 +27 小时是因为卡车在 15:00 出发,但当天发送的订单的截止时间是 12:00。

关于mysql - 将 LEFT JOIN 限制为最多一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58873477/

相关文章:

mysql - 仅按月和日比较日期

mysql - 我怎样才能优化这个特定的查询?

sql - 随机排序查询 Access

MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号?

jquery - 使用 CLASSIC ASP 将数据返回到 jsonp 调用

php - 如何打印从Wamp服务器获取的图像?

php - Laravel Eloquent 加入奇怪的查询

mysql - 组合查询返回不同的结果

vb6 - VB6和经典ASP静态代码分析

asp-classic - Request.QueryString 为空时出错