将剩余值添加到sql server中的下一行

将剩余值添加到sql server中的下一行,sql,sql-server,Sql,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

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

     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
和另一个具有其现有剩余卷的表。这两个表都与列OwnerID连接

     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
OwnerID   ExistingVolume
1         0.90
2         0.60
现在添加(应用)现有卷,当前卷(第一个表)如下 将新数量计算为整数,并将剩余的十进制值添加到客户的下一个期间

     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
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 
不要把计算出的体积四舍五入。当添加table1.Volume+table2.ExistingVolume时,只需获得全部。 剩余的十进制值(从第一行开始)应应用于下一行值表1。体积

有人能建议如何在SQL查询中实现这一点吗?

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

     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
为此,您可以使用累积和——以及一些算术:

     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
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)
。根据此定义,代码为:

     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
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;

是一个dbfiddle。

8.5
当按正常舍入规则进行舍入时,将变为9而不是8。请查看我的更新查询和预期输出。最好使用floor()或{fn truncate},因为.5向下舍入而不是向上舍入:选择floor(8.5),{fn truncate(8.5,0)},舍入(8.5,0);--或celing(-.5):)
     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