我在遞回術語中遇到了 sum() 的麻煩。基本上我的問題是這個。
讓我們說3種不同的成品。'ABC1', 'ABC2', 'ABC3' 每一個都是由 'ABC' 制成的。每個“ABC”都是由“AB”組成的。每個“AB”都是由“A”組成的。我出去賣了 10 個 'ABC1'、'ABC2'、'ABC3' 我正在嘗試進行查詢,根據我的銷售量給我一個每個專案的串列以及我需要多少該專案。
這是我正在尋找的回報的一個例子
| 物品 | 等級 | 賣 | 手上 | 必需的 |
|---|---|---|---|---|
| 一個 | 0 | 0 | 0 | 15 |
| AB | 1 | 0 | 10 | 25 |
| 美國廣播公司 | 2 | 10 | 0 | 25 |
| ABC1 | 3 | 10 | 5 | 10 |
| ABC2 | 3 | 10 | 5 | 10 |
| ABC3 | 3 | 10 | 5 | 10 |
對于一般表結構,您將擁有
| 物品 |
|---|
| item_id |
| item_onhand |
和
| 物料清單 |
|---|
| bom_product_id |
| bom_material_id |
和
| 銷售量 |
|---|
| sale_id |
| sale_item_id |
| 銷售數量 |
在我的情況下,我不能從頂部開始并下降。因為資料集處理時間太長。所以我必須從所有的銷售開始,然后從那里開始作業。
我的想法是為每個級別創建一個結果。然后遞回地往上走材料樹。類似的東西
WITH RECURSIVE sales_req AS(
SELECT item_id,
SUM(sale_qty) AS sales_req_sold,
item_onhand AS sales_req_qoh
FROM sales JOIN item ON sales_item_id = item_id
GROUP BY item_id
UNION
SELECT
item_id,
SUM(sales_req_sold - sales_req_qoh),
item_onhand
FROM
bom
JOIN sales_req ON bom_product_id = sales_req.item_id
JOIN item mat ON bom_material_id = mat.item_id
WHERE sales_req_sold > sales_req_qoh
第一個查詢回傳這樣的東西
| 物品 | 必需的 |
|---|---|
| 美國廣播公司 | 10 |
| ABC1 | 10 |
| ABC2 | 10 |
| ABC3 | 10 |
而遞回部分回傳這樣的東西
| 物品 | 必需的 | 筆記 |
|---|---|---|
| 美國廣播公司 | 15 | (“ABC1,ABC2,ABC3”的銷售額總和減去每個庫存的總和) |
| AB | 25 | (從 1,2 和 3 的 ABC 要求的總和加上出售 ABC 的要求) |
| 一個 | 15 | ( AB 減去 AB 的現有庫存) |
我需要某種替代解決方案來求和函式。但是有一些限制。我必須從銷售表開始。我不能限制水平。在這個例子中,我有 4 個級別,只有一個級別上有多個部分。但是可能有 7 個級別,每個級別可以有 3 個部分。我可以假設頂層是 1 個單項。
uj5u.com熱心網友回復:
嘗試這個 :
WITH RECURSIVE req AS(
SELECT item_id, item_onhand, SUM(sale_qty) AS item_sales
FROM sales INNER JOIN item ON sale_item_id = item_id
GROUP BY item_id, item_onhand
), accum (item_id, item_onhand, item_sales, item_req, level) AS (
SELECT item_id, item_onhand, item_sales, item_sales, 0
FROM req
UNION ALL
SELECT b.bom_product_id, a.item_onhand, a.item_sales, a.item_sales - a.item_onhand, a.level - 1
FROM accum AS a
INNER JOIN bom AS b ON b.bom_material_id = a.item_id
)
SELECT r.item_id, min(a.level) AS level, r.item_onhand AS on_hand, r.item_sales AS sold, sum(item_req) AS required
FROM accum AS a
INNER JOIN req AS r ON r.item_id = a.item_id
GROUP BY r.item_id, r.item_onhand, r.item_sales
ORDER BY level
在https://dbfiddle.uk/J7PMY1fZ中查看測驗結果[在此處輸入鏈接描述] 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520640.html
