需要按 qty 值给 temp table 赋值

Need to assign values to temp table by qty values

我有两个table

Table A - 订单项

CONS_KEY | LINE_NO | ITEM_QTY
------------------------------
1084353  | 1       | 3
1084353  | 2       | 1
1084354  | 1       | 2
1084354  | 2       | 1
1084354  | 3       | 2

Table B - 纸箱标签

CONS_KEY | LABEL_ID
-----------------------
1084353  | 717EXP00001
1084353  | 717EXP00002
1084353  | 717EXP00003
1084353  | 717EXP00004
1084354  | 718EXP00001
1084354  | 718EXP00002
1084354  | 718EXP00003
1084354  | 718EXP00004
1084354  | 718EXP00005

我需要创建一个临时 table 并使用每个 LINE_ITEM 的 ITEM_QTY 将 LINE_NO 分配给 LABEL_ID(和 CONS_KEY).

在TableA中,第一个ITEM_QTY表示前三个LABEL_ID的为LINE_NO = 1,然后是下一个LABEL_ID用于 LINE_NO = 2(CONS_KEY = 1084353 共有 4 个标签)

温度 Table - 预期结果

CONS_KEY | LABEL_ID     | LINE_NO
----------------------------------
1084353  | 717EXP00001  | 1
1084353  | 717EXP00002  | 1
1084353  | 717EXP00003  | 1
1084353  | 717EXP00004  | 2
1084354  | 718EXP00001  | 1
1084354  | 718EXP00002  | 1
1084354  | 718EXP00003  | 2
1084354  | 718EXP00004  | 3
1084354  | 718EXP00005  | 3

尽可能避免使用游标。 post 让我知道了我可以如何做到这一点,但不确定如何根据我的要求调整它 - Need to generate n rows based on a value in a column

您需要在此处添加一些技巧,因为您在两个 table 中多次出现 CONS_KEY 列,并且这是您用来连接它们的列。
第一个技巧是将 row_number 添加到 table B,这将为每个 cons_key 的每个标签 ID 提供一个数字,第二个技巧是将 dense_rank 添加到连接table A 和计数 table 将为您稍后在联接中使用的每一行提供一个数字。

首先,创建并填充示例 tables(在您以后的问题中为我们省去这一步):

DECLARE @A AS TABLE
(
    CONS_KEY int,
    LINE_NO int,
    ITEM_QTY int
);

INSERT INTO @A (CONS_KEY, LINE_NO, ITEM_QTY) VALUES
(1084353, 1, 3),
(1084353, 2, 1),
(1084354, 1, 2),
(1084354, 2, 1),
(1084354, 3, 2);

DECLARE @B AS TABLE
(
    CONS_KEY int,
    LABEL_ID varchar(20)
);

INSERT INTO @B (CONS_KEY, LABEL_ID) VALUES
(1084353, '717EXP00001'),
(1084353, '717EXP00002'),
(1084353, '717EXP00003'),
(1084353, '717EXP00004'),
(1084354, '718EXP00001'),
(1084354, '718EXP00002'),
(1084354, '718EXP00003'),
(1084354, '718EXP00004'),
(1084354, '718EXP00005');

然后,就像您链接到的答案一样,使用数字 table(在本例中,称为 Tally 的 cte)- 但您还需要另一个 cte 来添加 row_number - 这就是名为 B:

的 cte
WITH Tally(n) AS
(
    SELECT TOP (select max(ITEM_QTY) from @A) ROW_NUMBER() OVER(ORDER BY @@SPID) 
    FROM sys.objects 
), A AS
(
SELECT  CONS_KEY, LINE_NO, ITEM_QTY,
        DENSE_RANK() OVER(PARTITION BY CONS_KEY ORDER BY LINE_NO, N) As DR
FROM @A
JOIN Tally 
    ON ITEM_QTY >= n

), B AS
(
    SELECT CONS_KEY, LABEL_ID,
            ROW_NUMBER() OVER(PARTITION BY CONS_KEY ORDER BY LABEL_ID) As RN
    FROM @B
)

SELECT  A.CONS_KEY, LABEL_ID, LINE_NO, ITEM_QTY
FROM A
JOIN B 
    ON A.CONS_KEY = B.CONS_KEY 
    AND A.DR = B.RN 
ORDER BY A.CONS_KEY, LINE_NO, RN

结果:

CONS_KEY    LABEL_ID        LINE_NO     ITEM_QTY
1084353     717EXP00001     1           3
1084353     717EXP00002     1           3
1084353     717EXP00003     1           3
1084353     717EXP00004     2           1
1084354     718EXP00001     1           2
1084354     718EXP00002     1           2
1084354     718EXP00003     2           1
1084354     718EXP00004     3           2
1084354     718EXP00005     3           2

与第一个版本的区别:

  1. 计数 cte 现在改进为仅需要的数字。
  2. 添加了一个名为 A 的新 cte,其中有一个 dense_rank 列,其编号与 cte B 中的 row_number 列相同(这是缺少的内容原始版本)
  3. 在结果中包含 ITEM_QTY 列,以便更容易查看结果是否正确。