金额分摊sql

先设定俩表
--表T1为钢水总金额表
create table T1
(
  LH           VARCHAR2(4) not null,  --钢水炉号
  P             NUMBER(10,2) not null,  --钢水总金额
  GSL         NUMBER(8,2)              --总钢水量
);
alter table T1
  add constraint T1 primary key (LH));
数据如下:
LH                P                      GSL
0001        100000.00           100.11
0002        50000.00           80.99
--表T2为浇铸后信息表
create table T2
(
  LH        VARCHAR2(4) not null,  --钢水炉号
  P          NUMBER(10,2),  --钢水金额
  GSL       NUMBER(8,2)              --钢水量
);
数据如下:
LH          GSL              P
0001        50.00        
0001        40.00        
0001        10.11        
0002        30.00        
0002        25.00        
0002        25.99  
根据表T1的数据来计算表T2的P字段,计算公式为:每一行的T2.P = T1.P * T2.GSL /T1.GSL 但是要注意这样计算后的结果相加与表T1的金额数会有差值的问题。

解决方案,代码如下:

点击(此处)折叠或打开

  1. create table T1
  2. (
  3.   LH VARCHAR2(4) not null, --钢水炉号
  4.   P NUMBER(10,2) not null, --钢水总金额
  5.   GSL NUMBER(8,2) --总钢水量
  6. );
  7. INSERT INTO t1 VALUES('0001',100000.00,100.11);
  8. INSERT INTO t1 VALUES('0002',50000.00,80.99);

  9. create table T2
  10. (
  11.   LH VARCHAR2(4) not null, --钢水炉号
  12.   P NUMBER(10,2), --钢水金额
  13.   GSL NUMBER(8,2) --钢水量
  14. );
  15. INSERT INTO t2(lh,gsl) VALUES('0001',50.00);
  16. INSERT INTO t2(lh,gsl) VALUES('0001',40.00);
  17. INSERT INTO t2(lh,gsl) VALUES('0001',10.11);
  18. INSERT INTO t2(lh,gsl) VALUES('0002',30.00);
  19. INSERT INTO t2(lh,gsl) VALUES('0002',25.00);
  20. INSERT INTO t2(lh,gsl) VALUES('0002',25.99);

  21. SELECT t2.lh
  22.       ,t2.gsl
  23.       ,TRUNC(t1.p * t2.gsl / t1.gsl,2) -- 舍弃小数点2位之后
  24.        +(CASE WHEN ROW_NUMBER() OVER(PARTITION BY t2.lh ORDER BY t2.gsl DESC) --- 按顺序排列,前面的摊到0.01, 后面的就没有了
  25.                    <=(t1.p - SUM(TRUNC(t1.p * t2.gsl / t1.gsl,2)) OVER(PARTITION BY t2.lh))*100
  26.               THEN 0.01
  27.               ELSE 0
  28.          END) AS t2_p
  29.   FROM t1, t2
  30. WHERE t1.lh = t2.lh;

  31. --查询结果如下
  32.     LH GSL T2_P
    1 0001 50.00 49945.07
    2 0001 40.00 39956.04
    3 0001 10.11 10098.89
    4 0002 30.00 18520.81
    5 0002 25.99 16045.19
    6 0002 25.00 15434



 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21251711/viewspace-2122546/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21251711/viewspace-2122546/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值