将 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。
我正在尝试计算两次之间我们收到的订单数量,以及仓库人员打包了多少订单。
我们有一个关于订单的 '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。