找出 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)

Here's a live demo on dbfiddle

我会为您订购的和交付的产品创建两个聚合表示,然后对它们进行外部连接以获取差异。如果您使用的是 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;

Example DB<>Fiddle