1

使用 SQL Server 2008

我正在研究一种将多张发票合并为一张发票的方法。如果我不提供发票 ID,而是提供与多张发票相关联的批次 ID,我可以利用我们现有的索赔调整存储过程。

这个问题的细节允许一些自动化:要分组的发票在它们的表中总是相邻的,并且组大小在每组批次中是恒定的。

我的问题:T-SQL 是否提供了一种基于集合(即不是循环)的方法来自动增加每 N 条记录的“ID”列?

我知道基于非集合的方法是使用带有计数器的游标,该计数器每次 ID % N 等于 0 时都会递增。请参阅以下示例,了解每两条记录递增的字段:

    CREATE TABLE #BatchInvnums (id INT PRIMARY KEY IDENTITY, invnum INT, batchID INT)

    INSERT INTO #BatchInvnums (invnum)
    VALUES (178),(543),(724),(809),(164),(276)

    DECLARE @CurrentID INT,  @CurrentInvnum INT, @Counter INT = 0

    DECLARE CurBatchIDSetter CURSOR FORWARD_ONLY FOR
    SELECT ID, invnum
    FROM #BatchInvnums
    ORDER BY ID

    OPEN CurBatchIDSetter
    FETCH NEXT FROM CurBatchIDSetter INTO @CurrentID, @CurrentInvnum

    WHILE @@FETCH_STATUS = 0
    BEGIN
        UPDATE #BatchInvnums
        SET batchID = @Counter
        WHERE invnum = @CurrentInvnum

        IF @CurrentID % 2 = 0
        BEGIN
            SET @Counter = @Counter + 1
        END
        FETCH NEXT FROM CurBatchIDSetter INTO @CurrentID, @CurrentInvnum
    END

    CLOSE CurBatchIDSetter
    DEALLOCATE CurBatchIDSetter

同样,以上是我宁愿不做的。我想使用单个更新语句,或者更好的是,在创建表时应用一些属性来实现这种效果。有任何想法吗?

4

2 回答 2

2

我认为row_number()可能是解决方案的途径

update #BatchInvnums
set batchID = rn
from
    #BatchInvnums
        inner join
        (select id,
                (ROW_NUMBER()over(order by id)-1) / 2 rn 
         from #BatchInvnums) v
        on v.id = #batchinvnums.id
于 2013-09-12T15:40:02.383 回答
0

如何使用ROW_NUMBER(作为整数,然后整数除法)。

就像是

SELECT *,
(ROW_NUMBER() OVER(ORDER BY ID) - 1)/ 2 RowID
FROM TADA

SQL 小提琴演示

这也将允许您确定行号的分区和排序。

于 2013-09-12T15:41:35.530 回答