我们要迁移到的 ERP 系统需要 5,000 行或更少行的 csv 文件用于 GL。每个文件中的借方和贷方交易必须平衡为零。有多个借方和贷方事务行共享一个公共(public)事务 ID。

使用 offset 和 fetch next 我已经能够一次提取 5000 行,但是贷方和借方不平衡。

数据示例:

TranID  Credit  Debit   Balance Account#
1       250     0       250     ABC
1       0       250     0       DEF
2       0       100     -100    GHI
2       50      0       -50     JKL
2       50      0       0       MNO


declare @batchsize INT = 5000,
    @loopcount INT = 0;

while (@loopcount*@batchsize < (select  count(*) from [Apps2].[dbo].[GLTrans]))
begin
  SELECT *  FROM [Apps2].[dbo].[GLTrans]
  ORDER BY tranID
  offset (@batchsize * @loopcount) rows
  fetch next (@batchsize) rows only

  set @loopcount= @loopcount + 1
end

最佳答案

一个简单的解决方案是预处理所有交易并分配一个批次号(为每个 CSV 文件)。临时表存储了每个 TranID 的行数。

假设借记卡和贷记卡将针对每个 TranID 进行平衡。

之后,您可以根据临时表生成 CSV。

-- create the temp table
create table #trans
(
    TranID      int identity,
    Cnt         int,
    Batch       int
)

-- populate the temp table
insert into #trans (TranID, Cnt)
select TranID, Cnt = count(*)
from   [Apps2].[dbo].[GLTrans]
group by TranID

declare @batchsize  int = 5000,
        @batch      int = 1

while   exists (select * from #trans where Batch is null)
begin
    update  t
    set     Batch   = @batch
    from
    (
        select  *, cumm = sum(Cnt) over (order by TranID)
        from    #trans
        where   Batch   is null
    ) t
    where   cumm    <= @batchsize

    select  @batch = @batch + 1
end

--  Verify
select  *, sum(Cnt) over (partition by Batch order by TranID)
from    #trans
order by TranID

关于sql - 如何一次选择和导出5000行借方和贷方交易,并且借方和贷方余额为零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54757321/

10-13 06:07