![](/img/trans.png)
[英]SQL how to split Quantity into Multiple Rows based on Quantity on Target source
[英]Split quantity to multiple rows based on Quantity and Target dimension data
我有一張“主數據”表,我想根據 SQL 服務器中的數量和目標維度數據將數量拆分為多行,如下圖示例。
樣本數據
CREATE TABLE MasterData
(
JobNo VARCHAR(4),
Batch VARCHAR(4),
Tag VARCHAR(4),
UnitQtyInTag INT,
UnitQtyInSheet INT,
SheetQtyInTag INT
)
INSERT INTO MasterData
SELECT 'AAAA','B001','1',384,48,8
INSERT INTO MasterData
SELECT 'BBBB','B002','2',300,48,7
您可以使用遞歸 CTE 實現此功能,它將UnitQtyInTag
分配給連續的工作表,直到沒有剩余數量:
WITH sheets AS (
SELECT JobNo,
Batch,
Tag,
UnitQtyInTag,
UnitQtyInSheet,
SheetQtyInTag,
1 AS SheetNumber,
CASE WHEN UnitQtyInSheet > UnitQtyInTag THEN UnitQtyInTag
ELSE UnitQtyInSheet
END AS pcsinSheet,
CASE WHEN UnitQtyInSheet > UnitQtyInTag THEN 0
ELSE UnitQtyInTag - UnitQtyInSheet
END AS balance
FROM MasterData
UNION ALL
SELECT JobNo,
Batch,
Tag,
UnitQtyInTag,
UnitQtyInSheet,
SheetQtyInTag,
SheetNumber + 1,
CASE WHEN UnitQtyInSheet > balance THEN balance
ELSE UnitQtyInSheet
END,
CASE WHEN UnitQtyInSheet > balance THEN 0
ELSE balance - UnitQtyInSheet
END AS balance
FROM sheets
WHERE balance > 0
)
SELECT JobNo, Batch, Tag, UnitQtyInTag, UnitQtyInSheet, SheetQtyInTag, SheetNumber, pcsinSheet
FROM sheets
ORDER BY JobNo, Batch, Tag, SheetNumber
Output:
JobNo Batch Tag UnitQtyInTag UnitQtyInSheet SheetQtyInTag SheetNumber pcsinSheet
AAAA B001 1 384 48 8 1 48
AAAA B001 1 384 48 8 2 48
AAAA B001 1 384 48 8 3 48
AAAA B001 1 384 48 8 4 48
AAAA B001 1 384 48 8 5 48
AAAA B001 1 384 48 8 6 48
AAAA B001 1 384 48 8 7 48
AAAA B001 1 384 48 8 8 48
BBBB B002 2 300 48 7 1 48
BBBB B002 2 300 48 7 2 48
BBBB B002 2 300 48 7 3 48
BBBB B002 2 300 48 7 4 48
BBBB B002 2 300 48 7 5 48
BBBB B002 2 300 48 7 6 48
BBBB B002 2 300 48 7 7 12
我們可以使用日歷表方法解決這個問題,我們使用標簽中的工作表數量將序列表連接到您的表:
SELECT
t2.JobNo,
t2.Batch,
t2.Tag,
t2.UnitQtyInTag,
t2.UnitQtyInSheet,
t2.SheetQtyInTag,
t1.num AS SheetNumber
FROM
(
SELECT 1 AS num UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
) t1
INNER JOIN yourTable t2
ON t1.num <= t2.SheetQtyInTag
ORDER BY
t2.JobNo,
t2.Batch,
t2.Tag,
t1.num;
請注意,在實踐中,您可能希望用更可擴展的方式替換上面別名為t1
的內聯子查詢,以在 SQL 服務器中生成序列(在 SO 上的其他問題中已經很好地介紹了這一點)。
您可以通過交叉連接來實現,
select m1.* from MasterData m1
cross join MasterData m2;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.