需要按 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
与第一个版本的区别:
- 计数 cte 现在改进为仅需要的数字。
- 添加了一个名为
A
的新 cte,其中有一个 dense_rank
列,其编号与 cte B
中的 row_number
列相同(这是缺少的内容原始版本)
- 在结果中包含
ITEM_QTY
列,以便更容易查看结果是否正确。
我有两个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:
的 cteWITH 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
与第一个版本的区别:
- 计数 cte 现在改进为仅需要的数字。
- 添加了一个名为
A
的新 cte,其中有一个dense_rank
列,其编号与 cteB
中的row_number
列相同(这是缺少的内容原始版本) - 在结果中包含
ITEM_QTY
列,以便更容易查看结果是否正确。