我想获取状态为已交付的订单的产品总数量。如何将其编写为单个 sql 查询?
表_1:
表_2:
下面的 SQL 查询未按预期工作。因为它不查看订单的最新状态:
SELECT SUM(t1.quantity) AS total
FROM table_1 t1
LEFT JOIN table_2 t2
ON t1.order_id = t2.order_id
WHERE t2.order_status = 'delivered'
结果:9 (3+1+5) 此结果不正确。由于订单号 100001 的最后状态为“已返回”,因此不应将数字 3 添加到总数中。 正确的结果应该是 6 (1+5)。
最佳答案
您的查询中有两个问题:
- 您没有获取每个 order_id 的最新记录。您可以使用
ROW_NUMBER
执行此类操作窗口函数,为按 order_date 降序排序的 order_id 的每条记录分配排名(每个 order_id 的最后一个 order_date 的 rownum = 1)。然后您可以根据 rownum = 1 进行过滤。 - 您正在使用
LEFT JOIN
,但您只需要可以在“table_2”中找到并且严格满足条件的行。您应该使用INNER JOIN
.
WITH cte AS (
SELECT *, ROW_NUMBER() OVER(PARTITION BY order_id
ORDER BY order_date DESC, id DESC) AS rn
FROM table_2
)
SELECT SUM(quantity)
FROM table_1 t1
INNER JOIN cte t2
ON t1.order_id = t2.order_id
AND t2.order_status = 'delivered'
AND t2.rn = 1
如果由于某种原因无法使用公用表表达式,处理它的等效方法是将 cte 转换为子查询:
SELECT SUM(quantity)
FROM table_1 t1
INNER JOIN (SELECT *, ROW_NUMBER() OVER(PARTITION BY order_id
ORDER BY date DESC, id DESC) AS rn
FROM table_2) t2
ON t1.order_id = t2.order_id
AND t2.order_status = 'delivered'
AND t2.rn = 1
输出:
查看演示 here .
关于mysql - 返回状态为已交付的订单的产品总数量的 SQL(不同的两个表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75258533/