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

Limit LEFT JOIN to a maximum of one results

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

我们有一个关于订单的 'orders' table 以及订单何时完成,不幸的是,当它被处理时,例如不应添加到订单中的已取消订单计算它将收到一个 "Finished" 状态,这是太多我无法更改的遗留代码。

为了跟踪订单是否已打包,我想加入另一个名为 'orders_sent' 的 table,但不幸的是,如果一个订单有多个包裹,那么会有多个orders_id.

在 table 中排

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

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

"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 上分组,但这没有用,因为发送的 table 中不存在的所有订单都被分组在一起。尝试按 orders_id 分组给了我奇怪的结果,我无法解释(发送 6 个,总共 6 个)。不分组给我发送了 33 个,总共 54 个。

运行 SQL,跳过计数,只显示 orders_ID 我在那个时间段内使用下面的 SQL 总共得到 47 个订单。不分组显示一些重复的 ID,因为 orders_sent 包含几个订单的多行。

"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 table 的时间戳以确保我可以回到任何日期并查看当天的工作情况。 +27 小时是因为卡车在 15:00 出发,但本应在同一天发送的订单的截止时间是 12:00。