根据余数除法生成行

问题描述 投票:0回答:2

根据除法和余数生成行的最佳方法是什么?

declare @Total int = 203;
declare @Batch int = 100;

我用 T-SQL 做了一些复杂的查询,但它不起作用。

结果应该是:

100
100
3
sql sql-server
2个回答
1
投票

假设 最新版本的 SQL Server(撰写本文时为 2022),由于没有给出版本指示,一种方法是使用

GENERATE_SERIES
。您可以使用它来每批生成一行,然后在上限值大于总数时返回模数:

DECLARE @Total int = 203;
DECLARE @Batch int = 100;

SELECT CASE WHEN GS.[value] + @Batch <= @Total THEN @Batch
            ELSE @Total % @Batch
       END
FROM GENERATE_SERIES(0,@Total,@Batch) GS;

0
投票

如果您没有 SQL2022,这里有一种构建递归 CTE 然后使用该数据构建结果集的方法:

DECLARE @Total INT = 305;
DECLARE @Batch INT = 100;

WITH CTE
AS (
    SELECT @Batch AS Num, 1 AS x
    UNION ALL
    SELECT CTE.Num + @Batch, CTE.x + 1 FROM CTE WHERE CTE.Num + @Batch < @Total
)
SELECT CTE.Num / CTE.x FROM CTE
UNION ALL
SELECT @Total - MAX(CTE.Num)FROM CTE;

它最初以 @Batch 的步骤构建 CTE,但作为总数(例如 100 然后 200)直到下一次迭代将超过总数。我添加了一列以按 1 的计数进行迭代,以便我们稍后可以将 Num 除以 x 以使每个值返回到批量大小。

最后在 select 中有一个 UNION 来获取余数,即总和减去 CTE 迭代到的最大值

© www.soinside.com 2019 - 2024. All rights reserved.