Tsql 需要按数量值将值分配给临时表

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

我有两张桌子

表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  | 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
与第一版的区别:

  • 理货cte现在只提高到所需的数量
  • 添加了一个名为
    a
    的新cte,其
    densite\u rank
    列的编号与cte
    B
    中的
    行编号
    列的编号相同(这是原始版本中缺少的)
  • 在结果中包括
    项目数量
    列,以便更容易查看结果是否正确

  • 谢谢你的回答,但它并没有给出正确的结果,这也是我遇到的问题。未分配纸箱编号的完整序列,例如:717EXP000004718EXP00004和718EXP00005。纸箱标签需要按顺序继续到下一个行号。我明白你的意思。我会设法想出一个更好的解决办法。太好了。谢谢,这正是我需要的。很高兴能帮忙;-)我已经编辑了我的答案。