首页 > 解决方案 > 将剩余值添加到 sql server 中的下一行

问题描述

我有如下表,其中包含该期间的客户用电量。可用数据如

     OwnerID    StartDate   EndDate     Volume
        1       2019-01-01  2019-01-15  10.40
        1       2019-01-16  2019-01-31  5.80
        1       2019-02-01  2019-02-10  7.90
        1       2019-02-11  2019-02-28  8.50
        2       2019-03-01  2019-03-04  10.50

另一个表有其现有的剩余卷。两个表都与 Column OwnerID 连接

OwnerID   ExistingVolume
1         0.90
2         0.60

现在添加(应用)具有当前交易量(第一个表)的 ExistingVolume 作为将新交易量计算为整数和剩余的十进制值添加到客户的下一个期间。

So expected result set should like, 

    OwnerId StartDate   EndDate     CalulatedVolume RemainingExistingVolume 
    1       2019-01-01  2019-01-15  11              0.30
    1       2019-01-16  2019-01-31  6               0.10
    1       2019-02-01  2019-02-10  8               0.00
    1       2019-02-11  2019-02-28  8               0.50
    2       2019-03-01  2019-03-04  11              0.10 

不要四舍五入 CalulatedVolume。只需添加 table1.Volume + table2.ExistingVolume 即可获得整体。并且剩余的十进制值(从第一行开始)应该应用于下一行值 table1.Volume
你能建议如何在 SQL 查询中实现这一点吗?

标签: sqlsql-server

解决方案


如果我理解正确,您希望从舍入中累积“错误”并将其应用于第二个表中的值。

您可以为此目的使用累积和 - 以及一些算术:

select t1.ownerid, t1.startdate, t1.enddate,
       round(t1.volume, 0) as calculatedvolume,
       ( sum( t1.volume - round(t1.volume, 0) ) over (partition by t1.ownerid order by t1.startdate) +
         t2.existingvolume
       ) as remainingexisting
from table1 t1 left join
     table2 t2
     on t1.ownerid = t2.ownerid;

您对舍入有非标准定义。这可以实现为ceil(x - 0.5)。有了这个定义,代码是:

select t1.ownerid, t1.startdate, t1.enddate,
       ceiling(t1.volume - 0.5) as calculatedvolume,
       ( sum( t1.volume - ceiling(t1.volume - 0.5) ) over (partition by t1.ownerid order by t1.startdate) +
         t2.existingvolume
       ) as remainingexisting
from table1 t1 left join
     table2 t2
     on t1.ownerid = t2.ownerid;

是一个 db<>fiddle。


推荐阅读