我有兩張桌子,比如說 OrderPlaced 和 OrderDelivered。
OrderPlaced 表如下所示:

在一個訂單中,我們可以有多個產品(由表中的 sku 定義),每個產品可以有多個數量。
OrderDelivered 表如下所示:

因此,從技術上講,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 缺失。我知道我也必須檢查數量,但想不出該怎么做。如果有人可以幫助我完成那部分,我將不勝感激。
uj5u.com熱心網友回復:
將每個訂單和 sku 的交貨加起來,然后將交貨數量外部連接到訂單表,以便您可以比較數量。
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;
uj5u.com熱心網友回復:
您的查詢適用于任何尚未交付的物品,這是您的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)
這是關于 dbfiddle 的現場演示
uj5u.com熱心網友回復:
我將為您訂購和交付的產品創建兩個聚合表示,然后將它們外部連接以獲取差異。如果您使用的是 MySql 8,您可以將它們表示為 CTE,否則只需使用兩個等效的子查詢
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;
示例 DB<>Fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/427354.html
上一篇:PHP標頭函式重定向到404錯誤
