Tsql 需要按数量值将值分配给临时表
我有两张桌子 表A-行项目Tsql 需要按数量值将值分配给临时表,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我有两张桌子 表A-行项目 CONS_KEY | LINE_NO | ITEM_QTY ------------------------------ 1084353 | 1 | 3 1084353 | 2 | 1 1084354 | 1 | 2 1084354 | 2 | 1 1084354 | 3 | 2 CONS_KEY | LABEL_ID ----------------------- 1084353 | 717E
CONS_KEY | LINE_NO | ITEM_QTY
------------------------------
1084353 | 1 | 3
1084353 | 2 | 1
1084354 | 1 | 2
1084354 | 2 | 1
1084354 | 3 | 2
CONS_KEY | LABEL_ID
-----------------------
1084353 | 717EXP00001
1084353 | 717EXP00002
1084353 | 717EXP00003
1084353 | 717EXP00004
1084354 | 718EXP00001
1084354 | 718EXP00002
1084354 | 718EXP00003
1084354 | 718EXP00004
1084354 | 718EXP00005
表B-纸箱标签
CONS_KEY | LINE_NO | ITEM_QTY
------------------------------
1084353 | 1 | 3
1084353 | 2 | 1
1084354 | 1 | 2
1084354 | 2 | 1
1084354 | 3 | 2
CONS_KEY | LABEL_ID
-----------------------
1084353 | 717EXP00001
1084353 | 717EXP00002
1084353 | 717EXP00003
1084353 | 717EXP00004
1084354 | 718EXP00001
1084354 | 718EXP00002
1084354 | 718EXP00003
1084354 | 718EXP00004
1084354 | 718EXP00005
我需要创建一个临时表,并使用每个行项目的项目数量(和CONS键)将行编号分配给标签ID
在表A中,第一个项目数量表示前三个标签ID用于第1行,然后下一个标签ID用于第2行(共4个标签用于CONS\U KEY=1084353)
临时表-预期结果
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
尽可能避免使用光标。
这篇文章给了我一个想法,我可以如何做到这一点,但不确定如何根据我的要求调整它-您需要在这里添加一些技巧,因为两个表中都多次出现了
CONS\u KEY
列,而这正是用于连接它们的列。第一个技巧是将
row\u number
添加到表B中,这将为每个cons\u键的每个标签id提供一个数字,第二个技巧是将densite\u rank
添加到表a的联接和理货表中,这将为以后在联接中使用的每一行提供一个数字
首先,创建并填充示例表(请在以后的问题中保存此步骤):
然后,就像您链接到的答案一样,使用一个数字表(在本例中,cte称为Tally)-但您还需要另一个cte来添加行号-这就是称为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
与第一版的区别:
a
的新cte,其densite\u rank
列的编号与cteB
中的行编号
列的编号相同(这是原始版本中缺少的)项目数量
列,以便更容易查看结果是否正确谢谢你的回答,但它并没有给出正确的结果,这也是我遇到的问题。未分配纸箱编号的完整序列,例如:717EXP000004718EXP00004和718EXP00005。纸箱标签需要按顺序继续到下一个行号。我明白你的意思。我会设法想出一个更好的解决办法。太好了。谢谢,这正是我需要的。很高兴能帮忙;-)我已经编辑了我的答案。