sql - 模数后以最小余额运行总计

标签 sql sql-server-2008

目前,下面的代码以 50 为上限运行总计。

现在我想将 50 作为剩余的最小值。我怎么可能这样做。任何提示都会非常有帮助。 (最低余额 50)。此代码在sql 2012中,需要它才能在sql2008及以上版本中运行

示例:

 - 10        10
 - 20        30
 - 30        60
 - 40        100  --> 50 (min value of 50) 100-50 = 50
 - 2         52 
 - 3         55
 - 10        65
 - 25        90
 - 15        105  --> 55 (min value 50, 105-50 = 55)
 - 5         60

DECLARE @Table TABLE (Id INT, ListItem INT);
INSERT INTO @Table VALUES (1, 10);
INSERT INTO @Table VALUES (2, 20);
INSERT INTO @Table VALUES (3, 30);
INSERT INTO @Table VALUES (4, 40);
INSERT INTO @Table VALUES (5, 2);
INSERT INTO @Table VALUES (6, 3);
INSERT INTO @Table VALUES (7, 10);
INSERT INTO @Table VALUES (8, 25);
INSERT INTO @Table VALUES (9, 15);
INSERT INTO @Table VALUES (10, 5);
WITH RunningTotal AS (
SELECT Id, ListItem, SUM(ListItem) OVER (ORDER BY Id) % 50 AS RT FROM     @Table)
SELECT
    rt.Id,
    rt.ListItem,
    CASE WHEN rt.RT < rt2.RT THEN rt.RT + 50 ELSE rt.RT END AS RunningTotal
FROM
    RunningTotal rt
    LEFT JOIN RunningTotal rt2 ON rt2.Id = rt.Id - 1
ORDER BY
    rt.Id;

编辑:

现在我明白了。但是当我尝试更改值时,它只工作一次。比如累计值超过350000,扣除300000,即最低余额为50000。

有什么提示吗?

链接:http://sqlfiddle.com/#!6/c9051/1/0

谢谢。

最佳答案

关键是,当您的数字超过 100 时,您只想对 50 取模。这将使您得到 50 以上的“余数”,您可以将其加 50 以获得所需的输出

WITH RunningTotal AS (
SELECT Id, ListItem, SUM(ListItem) OVER (ORDER BY Id) AS RT FROM     @Table)


SELECT Id, ListItem, RT, CASE WHEN RT > 100 THEN RT % 50 + 50 ELSE RT END AS NewRT
FROM RunningTotal

关于sql - 模数后以最小余额运行总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30187607/

相关文章:

sql - 将可变参数列表传递给 SqlServer2008 存储过程的 Sane/fast 方法

将 Excel 数据添加到 Access 的 SQL 更新查询

SQL Server 对行进行分组

C# 从时间戳获取日期

c# - 使用 Levenshtein 距离检测字符串相似性(很慢)

sql - 判断sql中不相等的具体字段

sql - 将 Visual Foxpro 数据库导入到 SQL Server

sql - SQL 中三列中最大的列

sql - TSQL 从 xml 值中删除制表符和换行符

c# - 在 SQL Server 中使用数组