如何在PL/SQL中计算按比例计算?
我想在PL/SQL中按比例进行如何在PL/SQL中计算按比例计算?,sql,oracle,plsql,Sql,Oracle,Plsql,我想在PL/SQL中按比例进行计算,但我不知道怎么做 下面是我的例子: ID class Wages Premium 1 A 15000 250 2 A 10000 0 我想在类内按比例计算保费,即对于每个类中的每个ID,我想根据工资按比例计算保费 这里,对于ID 1, 它将: premium = (15000 *sum(premium))/(sum(wages)) = (15000 * 250)/(25000) = 150 因此,对于ID
计算,但我不知道怎么做
下面是我的例子:
ID class Wages Premium
1 A 15000 250
2 A 10000 0
我想在类内按比例计算保费,即对于每个类中的每个ID,我想根据工资按比例计算保费
这里,对于ID 1,
它将:
premium = (15000 *sum(premium))/(sum(wages)) = (15000 * 250)/(25000) = 150
因此,对于ID 2:
premium = (10000 * 250)/(25000) = 100
显然,我必须在更大量的数据上这样做。。。但是到现在为止我还没有做太多的PL/SQL
我可以补充一点,我必须通过更新声明来完成这项工作
你能帮我吗
非常感谢试试看
with data(class, sum_pre, sum_wage) as (
select class, sum(Premium), sum(Wages)
from tbl
group by class
)
select t.ID, t.class
t.Wages * s.sum_pre/ s.sum_wage as val
from tbl t
join data s on s.class = t.class
更新
MERGE
INTO tbl t
USING (
with data(class, sum_pre, sum_wage) as (
select class, sum(Premium), sum(Wages)
from tbl
group by class
)
select t.ID
t.Wages * s.sum_pre/ s.sum_wage as val
from tbl t
join data s on s.class = t.class
) x
ON (x.ID = t.ID)
WHEN MATCHED THEN
UPDATE
SET premium = x.val;
尝试
更新
MERGE
INTO tbl t
USING (
with data(class, sum_pre, sum_wage) as (
select class, sum(Premium), sum(Wages)
from tbl
group by class
)
select t.ID
t.Wages * s.sum_pre/ s.sum_wage as val
from tbl t
join data s on s.class = t.class
) x
ON (x.ID = t.ID)
WHEN MATCHED THEN
UPDATE
SET premium = x.val;
尝试
更新
MERGE
INTO tbl t
USING (
with data(class, sum_pre, sum_wage) as (
select class, sum(Premium), sum(Wages)
from tbl
group by class
)
select t.ID
t.Wages * s.sum_pre/ s.sum_wage as val
from tbl t
join data s on s.class = t.class
) x
ON (x.ID = t.ID)
WHEN MATCHED THEN
UPDATE
SET premium = x.val;
尝试
更新
MERGE
INTO tbl t
USING (
with data(class, sum_pre, sum_wage) as (
select class, sum(Premium), sum(Wages)
from tbl
group by class
)
select t.ID
t.Wages * s.sum_pre/ s.sum_wage as val
from tbl t
join data s on s.class = t.class
) x
ON (x.ID = t.ID)
WHEN MATCHED THEN
UPDATE
SET premium = x.val;
您可以使用分析函数轻松计算新的保费值:
create table prorata_test as
select 1 id,
'A' class,
15000 wages,
250 premium
from dual
union all
select 2 id,
'A' class,
10000 wages,
0 premium
from dual
union all
select 3 id,
'B' class,
10000 wages,
50 premium
from dual;
select id,
class,
wages,
premium,
sum(wages) over (partition by class) tot_wages,
sum(premium) over (partition by class) tot_premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test;
ID CLASS WAGES PREMIUM TOT_WAGES TOT_PREMIUM NEW_PREMIUM
---------- ----- ---------- ---------- ---------- ----------- -----------
1 A 15000 250 25000 250 150
2 A 10000 0 25000 250 100
3 B 10000 50 10000 50 50
因此,您可以看到,计算tot_工资和to_溢价列的分析求和函数汇总了每个类的值(这是我们划分的(也称为分组依据)),因此您可以在新的_溢价计算中使用它们
要存储新的premium值,可以使用带有上述查询的MERGE语句作为源数据集,如下所示:
merge into prorata_test tgt
using (select id,
class,
wages,
premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test) src
on (tgt.id = src.id)
when matched then
update set tgt.premium = src.new_premium;
commit;
select *
from prorata_test
order by id;
ID CLASS WAGES PREMIUM
---------- ----- ---------- ----------
1 A 15000 150
2 A 10000 100
3 B 10000 50
注意:我在这里假设ID是主键(或者至少它在整个表中是唯一的!)。您可以使用分析函数轻松计算新的溢价值:
create table prorata_test as
select 1 id,
'A' class,
15000 wages,
250 premium
from dual
union all
select 2 id,
'A' class,
10000 wages,
0 premium
from dual
union all
select 3 id,
'B' class,
10000 wages,
50 premium
from dual;
select id,
class,
wages,
premium,
sum(wages) over (partition by class) tot_wages,
sum(premium) over (partition by class) tot_premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test;
ID CLASS WAGES PREMIUM TOT_WAGES TOT_PREMIUM NEW_PREMIUM
---------- ----- ---------- ---------- ---------- ----------- -----------
1 A 15000 250 25000 250 150
2 A 10000 0 25000 250 100
3 B 10000 50 10000 50 50
因此,您可以看到,计算tot_工资和to_溢价列的分析求和函数汇总了每个类的值(这是我们划分的(也称为分组依据)),因此您可以在新的_溢价计算中使用它们
要存储新的premium值,可以使用带有上述查询的MERGE语句作为源数据集,如下所示:
merge into prorata_test tgt
using (select id,
class,
wages,
premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test) src
on (tgt.id = src.id)
when matched then
update set tgt.premium = src.new_premium;
commit;
select *
from prorata_test
order by id;
ID CLASS WAGES PREMIUM
---------- ----- ---------- ----------
1 A 15000 150
2 A 10000 100
3 B 10000 50
注意:我在这里假设ID是主键(或者至少它在整个表中是唯一的!)。您可以使用分析函数轻松计算新的溢价值:
create table prorata_test as
select 1 id,
'A' class,
15000 wages,
250 premium
from dual
union all
select 2 id,
'A' class,
10000 wages,
0 premium
from dual
union all
select 3 id,
'B' class,
10000 wages,
50 premium
from dual;
select id,
class,
wages,
premium,
sum(wages) over (partition by class) tot_wages,
sum(premium) over (partition by class) tot_premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test;
ID CLASS WAGES PREMIUM TOT_WAGES TOT_PREMIUM NEW_PREMIUM
---------- ----- ---------- ---------- ---------- ----------- -----------
1 A 15000 250 25000 250 150
2 A 10000 0 25000 250 100
3 B 10000 50 10000 50 50
因此,您可以看到,计算tot_工资和to_溢价列的分析求和函数汇总了每个类的值(这是我们划分的(也称为分组依据)),因此您可以在新的_溢价计算中使用它们
要存储新的premium值,可以使用带有上述查询的MERGE语句作为源数据集,如下所示:
merge into prorata_test tgt
using (select id,
class,
wages,
premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test) src
on (tgt.id = src.id)
when matched then
update set tgt.premium = src.new_premium;
commit;
select *
from prorata_test
order by id;
ID CLASS WAGES PREMIUM
---------- ----- ---------- ----------
1 A 15000 150
2 A 10000 100
3 B 10000 50
注意:我在这里假设ID是主键(或者至少它在整个表中是唯一的!)。您可以使用分析函数轻松计算新的溢价值:
create table prorata_test as
select 1 id,
'A' class,
15000 wages,
250 premium
from dual
union all
select 2 id,
'A' class,
10000 wages,
0 premium
from dual
union all
select 3 id,
'B' class,
10000 wages,
50 premium
from dual;
select id,
class,
wages,
premium,
sum(wages) over (partition by class) tot_wages,
sum(premium) over (partition by class) tot_premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test;
ID CLASS WAGES PREMIUM TOT_WAGES TOT_PREMIUM NEW_PREMIUM
---------- ----- ---------- ---------- ---------- ----------- -----------
1 A 15000 250 25000 250 150
2 A 10000 0 25000 250 100
3 B 10000 50 10000 50 50
因此,您可以看到,计算tot_工资和to_溢价列的分析求和函数汇总了每个类的值(这是我们划分的(也称为分组依据)),因此您可以在新的_溢价计算中使用它们
要存储新的premium值,可以使用带有上述查询的MERGE语句作为源数据集,如下所示:
merge into prorata_test tgt
using (select id,
class,
wages,
premium,
wages * sum(premium) over (partition by class) / sum(wages) over (partition by class) new_premium
from prorata_test) src
on (tgt.id = src.id)
when matched then
update set tgt.premium = src.new_premium;
commit;
select *
from prorata_test
order by id;
ID CLASS WAGES PREMIUM
---------- ----- ---------- ----------
1 A 15000 150
2 A 10000 100
3 B 10000 50
注意:我在这里假设ID是主键(或者至少,它在整个表中是唯一的!)。最有效的方法是使用ratio_to_report(),这常常被奇怪地忽略
select id,
premium,
sum(premium) over (partition by class) *
ratio_to_report(wages) over (partition by class) prorated_premium
from my_table
有关更新,我将查看:
update (query from above)
set premium = prorated_premium
最有效的方法是使用ratio_to_report(),这常常被奇怪地忽略
select id,
premium,
sum(premium) over (partition by class) *
ratio_to_report(wages) over (partition by class) prorated_premium
from my_table
有关更新,我将查看:
update (query from above)
set premium = prorated_premium
最有效的方法是使用ratio_to_report(),这常常被奇怪地忽略
select id,
premium,
sum(premium) over (partition by class) *
ratio_to_report(wages) over (partition by class) prorated_premium
from my_table
有关更新,我将查看:
update (query from above)
set premium = prorated_premium
最有效的方法是使用ratio_to_report(),这常常被奇怪地忽略
select id,
premium,
sum(premium) over (partition by class) *
ratio_to_report(wages) over (partition by class) prorated_premium
from my_table
有关更新,我将查看:
update (query from above)
set premium = prorated_premium
为什么要存储过程?为什么要存储过程?为什么要存储过程?为什么要存储过程?为什么要存储过程?