clsl

SQL Server中ROW_NUMBER()函数的使用 参考文章:https://blog.csdn.net/pan_junbiao/article/details/79941162

业务中的问题:固定资产的单价和总价由于设置成小数点两位,导致资产的总数拆分数量后的单价和单价乘数量的值并不完全相同,有小数点上的问题。

如某资产总价为10,数量为3个, 则单价 10/3=3.333333333  这里取两位小数存为3.33

但单价*数量后  3.33*3=9.99,9.99和10相差0.01。由于数据库的单价和总价设置都为两位小数点,所以小数点问题无法进行完全匹配。

解决方案是将小数点的把尾差放到其中一个资产,也就是说 总资产价值为10,数量为3的资产,通过将其中一个资产的单价加0.01 实现资产单价乘上数量后和总价完全匹配。

 

解决的思路:将整合的小数点有问题资产整合成excel,其中主要包括资产编号和总价差两个字段

将excel导入到数据库中生成临时表,通过资产编号关联资产表和临时表,取到资产分组的最后一个资产的id(ROW_NUMBER() OVER(ORDER BY Score DESC)),将这些资产的单价加上总价差,然后批量修改完成对所有有问题的资产进行了校对   

贴上sql语句

--修改单价问题
update tab_assets set price=price+wrongprice$.pricenum from wrongprice$ join tab_assets on wrongprice$.code=tab_assets.code where tab_assets.id in(select id from (SELECT ROW_NUMBER() OVER(PARTITION BY code ORDER BY id desc ) AS Row_Index,*
FROM tab_assets
where tab_assets.code in(\'A104201900001\',\'A104201900002\',\'A104201900003\',\'A104201900005\',\'A201201800800\',\'A201201800814\',\'A201201900033\',\'A201201900034\',\'A201201900035\',\'A201201900038\',\'A201201900039\',\'A201201900078\',\'A201201900126\',\'A202201800067\',\'A230201900001\',\'A230201900002\',\'A232201800168\',\'A232201800233\',\'A232201800236\',\'A232201800237\',\'A232201800245\',\'A232201800246\',\'A232201900002\',\'A232201900021\',\'A501201900003\',\'A601201800330\',\'A601201800354\',\'A601201900013\')) t
where t.Row_Index=1)

附上导入的临时表,资产编号和价差字段

 

 

 

 

 

 

 

 

 

分类:

技术点:

相关文章: