簡體   English   中英

根據數量和目標維度數據將數量拆分為多行

[英]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

dbfiddle 上的演示

我們可以使用日歷表方法解決這個問題,我們使用標簽中的工作表數量將序列表連接到您的表:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM