找出 table 中可用的额外数量
Find out extra quantity available in a table
我有两个 table,比如说 OrderPlaced 和 OrderDelivered。
下订单 table 看起来像这样:
在一个订单中我们可以有多个产品(由 table 中的 sku 定义)并且每个产品可以有多个数量。
交付的订单 table 如下所示:
所以从技术上讲,有 3 个产品尚未交付。 Orderid 1000 - 产品 S101,Orderid 1001 - 产品 S102(需要 3 个数量,但已交付 2 个)和 Orderid 1002 - 产品 S100。
我正在尝试编写一个 SQL 查询,它可以为我提供尚未交付的 OrderId 和 sku。现在我写了类似
的东西
select OrderPlaced.orderid,OrderPlaced.sku
from OrderPlaced
left join OrderDelivered
on OrderPlaced.Orderid = OrderDelivered.orderid and OrderPlaced.sku = OrderDelivered.sku
where OrderDelivered.sku is NULL;
这是给我 Orderid 1000 - 产品 S101 和 Orderid 1002 - 产品 S100,但缺少 Orderid 1001 - 产品 S102。我知道我也必须检查数量,但不知道该怎么做。如果有人可以帮助我,我将不胜感激。
将每个订单和 sku 的交货量相加,然后将交货数量外联到订单中table,这样您就可以比较数量。
select
p.orderid,
p.sku,
p.qty as ordered,
coalesce(d.sum_qty, 0) as delivered
from orderplaced p
left join
(
select orderid, sku, sum(qty) as sum_qty
from orderdelivered
group by orderid, sku
) d on d.orderid = p.orderid and d.sku = p.sku
where p.qty > coalesce(d.sum_qty, 0)
order by p.orderid, p.sku;
您的查询适用于任何尚未交付的项目,这是您的WHERE OrderDelivered.sku IS NULL
。但是您也可能遇到交付的商品比订购的商品少的情况,重要的是,您可以有多个与您的交付相关的记录,即使它们引用相同的订单和 sku(两行,每行 1 个)。
在这种情况下,您需要汇总每个下订单的所有交付 ID、sku 和数量(下面查询中的 GROUP BY
子句)检查总和(如果没有发现则为 0)是否不同来自已下订单(HAVING
子句)。您可以使用这样的查询:
SELECT OrderPlaced.orderid, OrderPlaced.sku,
OrderPlaced.qty - COALESCE(SUM(OrderDelivered.qty), 0) AS qty_missing,
CASE
WHEN SUM(OrderDelivered.qty) IS NULL
THEN 'Yes'
ELSE 'No'
END AS is_missing_completely
FROM OrderPlaced
LEFT
JOIN OrderDelivered
ON OrderPlaced.Orderid = OrderDelivered.orderid
AND OrderPlaced.sku = OrderDelivered.sku
GROUP BY OrderPlaced.orderid, OrderPlaced.sku, OrderPlaced.qty
HAVING OrderPlaced.qty != COALESCE(SUM(OrderDelivered.qty), 0)
我会为您订购的和交付的产品创建两个聚合表示,然后对它们进行外部连接以获取差异。如果您使用的是 MySql 8,则可以将它们表示为 CTE,否则只需使用两个等效的 sub-queries
with op as (
select OrderId, Sku, Sum(qty) Qty
from OrderPlaced
group by OrderId, Sku
), od as (
select OrderId, Sku, Sum(qty) Qty
from OrderDelivered
group by OrderId, Sku
)
select op.OrderId, op.Sku, op.Qty - Coalesce(od.qty,0) notDelivered
from op
left join od on od.orderid = op.orderid and od.sku = op.sku
where op.Qty - Coalesce(od.qty,0)>0;
我有两个 table,比如说 OrderPlaced 和 OrderDelivered。
下订单 table 看起来像这样:
在一个订单中我们可以有多个产品(由 table 中的 sku 定义)并且每个产品可以有多个数量。
交付的订单 table 如下所示:
所以从技术上讲,有 3 个产品尚未交付。 Orderid 1000 - 产品 S101,Orderid 1001 - 产品 S102(需要 3 个数量,但已交付 2 个)和 Orderid 1002 - 产品 S100。
我正在尝试编写一个 SQL 查询,它可以为我提供尚未交付的 OrderId 和 sku。现在我写了类似
的东西select OrderPlaced.orderid,OrderPlaced.sku
from OrderPlaced
left join OrderDelivered
on OrderPlaced.Orderid = OrderDelivered.orderid and OrderPlaced.sku = OrderDelivered.sku
where OrderDelivered.sku is NULL;
这是给我 Orderid 1000 - 产品 S101 和 Orderid 1002 - 产品 S100,但缺少 Orderid 1001 - 产品 S102。我知道我也必须检查数量,但不知道该怎么做。如果有人可以帮助我,我将不胜感激。
将每个订单和 sku 的交货量相加,然后将交货数量外联到订单中table,这样您就可以比较数量。
select
p.orderid,
p.sku,
p.qty as ordered,
coalesce(d.sum_qty, 0) as delivered
from orderplaced p
left join
(
select orderid, sku, sum(qty) as sum_qty
from orderdelivered
group by orderid, sku
) d on d.orderid = p.orderid and d.sku = p.sku
where p.qty > coalesce(d.sum_qty, 0)
order by p.orderid, p.sku;
您的查询适用于任何尚未交付的项目,这是您的WHERE OrderDelivered.sku IS NULL
。但是您也可能遇到交付的商品比订购的商品少的情况,重要的是,您可以有多个与您的交付相关的记录,即使它们引用相同的订单和 sku(两行,每行 1 个)。
在这种情况下,您需要汇总每个下订单的所有交付 ID、sku 和数量(下面查询中的 GROUP BY
子句)检查总和(如果没有发现则为 0)是否不同来自已下订单(HAVING
子句)。您可以使用这样的查询:
SELECT OrderPlaced.orderid, OrderPlaced.sku,
OrderPlaced.qty - COALESCE(SUM(OrderDelivered.qty), 0) AS qty_missing,
CASE
WHEN SUM(OrderDelivered.qty) IS NULL
THEN 'Yes'
ELSE 'No'
END AS is_missing_completely
FROM OrderPlaced
LEFT
JOIN OrderDelivered
ON OrderPlaced.Orderid = OrderDelivered.orderid
AND OrderPlaced.sku = OrderDelivered.sku
GROUP BY OrderPlaced.orderid, OrderPlaced.sku, OrderPlaced.qty
HAVING OrderPlaced.qty != COALESCE(SUM(OrderDelivered.qty), 0)
我会为您订购的和交付的产品创建两个聚合表示,然后对它们进行外部连接以获取差异。如果您使用的是 MySql 8,则可以将它们表示为 CTE,否则只需使用两个等效的 sub-queries
with op as (
select OrderId, Sku, Sum(qty) Qty
from OrderPlaced
group by OrderId, Sku
), od as (
select OrderId, Sku, Sum(qty) Qty
from OrderDelivered
group by OrderId, Sku
)
select op.OrderId, op.Sku, op.Qty - Coalesce(od.qty,0) notDelivered
from op
left join od on od.orderid = op.orderid and od.sku = op.sku
where op.Qty - Coalesce(od.qty,0)>0;