将剩余值添加到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