Oracle SQL中的增量总计
我需要帮助编写SQL查询以计算增量总计 例如,对于2015年,初始值为10,同比变化百分比。我需要每年的总价值。简单地说,一笔10英镑的定期存款,每年的利息都会发生变化,那么每年的累计总价值是多少呢Oracle SQL中的增量总计,sql,oracle,Sql,Oracle,我需要帮助编写SQL查询以计算增量总计 例如,对于2015年,初始值为10,同比变化百分比。我需要每年的总价值。简单地说,一笔10英镑的定期存款,每年的利息都会发生变化,那么每年的累计总价值是多少呢 Year Initial Deposit Change Percent Change Value Final Value ---- ----------------- -------------- ------------ ----------- 2015 Initi
Year Initial Deposit Change Percent Change Value Final Value
---- ----------------- -------------- ------------ -----------
2015 Initial - 10 10 1 11
2016 11 10 1.1 12.1
2017 12.1 5
2018 15
2019 20
2020 30
2021 0
2022 -10
2023 -5
2024 1
在表中,仅计算前两步。这可以使用递归CTE(公共表表达式)完成 初始荷载:
create table a(year integer, perc integer
);
insert into a values (2015, 10);
insert into a values (2016,10);
insert into a values (2017,5);
insert into a values (2018,15);
insert into a values (2019,20);
insert into a values (2020,30);
insert into a values (2021,0);
insert into a values (2022,-10);
insert into a values (2023,-5);
insert into a values (2024,1);
现在计算:
with s(year, deposit, perc, interest, final_val) as (
select 2015 year, initial_amount, perc,
initial_amount*perc interest/100,
initial_amount*(perc+100)/100 as final_val
from a cross join (select 10 as initial_amount from dual)
where year = 2015
union all
select a.year, s.final_val, a.perc, s.final_val*a.perc/100, s.final_val*(a.perc+100)/100
from s join a on s.year+1 = a.year
)
select * from s
;
结果:
| YEAR | DEPOSIT | PERC | INTEREST | FINAL_VAL |
|------|-------------|------|--------------|---------------|
| 2015 | 10 | 10 | 1 | 11 |
| 2016 | 11 | 10 | 1.1 | 12.1 |
| 2017 | 12.1 | 5 | 0.605 | 12.705 |
| 2018 | 12.705 | 15 | 1.90575 | 14.61075 |
| 2019 | 14.61075 | 20 | 2.92215 | 17.5329 |
| 2020 | 17.5329 | 30 | 5.25987 | 22.79277 |
| 2021 | 22.79277 | 0 | 0 | 22.79277 |
| 2022 | 22.79277 | -10 | -2.279277 | 20.513493 |
| 2023 | 20.513493 | -5 | -1.02567465 | 19.48781835 |
| 2024 | 19.48781835 | 1 | 0.1948781835 | 19.6826965335 |
Oracle 11g R2架构设置:
create table your_table(year integer, perc integer );
insert into your_table values (2015, 10);
insert into your_table values (2016,10);
insert into your_table values (2017,5);
insert into your_table values (2018,15);
insert into your_table values (2019,20);
insert into your_table values (2020,30);
insert into your_table values (2021,0);
insert into your_table values (2022,-10);
insert into your_table values (2023,-5);
insert into your_table values (2024,1);
WITH initial_value AS (
SELECT 10 AS Initial_value FROM DUAL
)
SELECT YEAR,
initial_value * POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) ) AS "Initial Value",
PERC,
POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) ) AS "Previous Cumulative Multiplier",
initial_value * POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), 0 ) ) AS "Final Value"
FROM your_table
CROSS JOIN
initial_value
| YEAR | Initial Value | PERC | Previous Cumulative Multiplier | Final Value |
|------|---------------|------|--------------------------------|---------------|
| 2015 | 10 | 10 | 1 | 11 |
| 2016 | 11 | 10 | 1.1 | 12.1 |
| 2017 | 12.1 | 5 | 1.21 | 12.705 |
| 2018 | 12.705 | 15 | 1.2705 | 14.61075 |
| 2019 | 14.61075 | 20 | 1.461075 | 17.5329 |
| 2020 | 17.5329 | 30 | 1.75329 | 22.79277 |
| 2021 | 22.79277 | 0 | 2.279277 | 22.79277 |
| 2022 | 22.79277 | -10 | 2.279277 | 20.513493 |
| 2023 | 20.513493 | -5 | 2.0513493 | 19.48781835 |
| 2024 | 19.48781835 | 1 | 1.948781835 | 19.6826965335 |
查询1:
create table your_table(year integer, perc integer );
insert into your_table values (2015, 10);
insert into your_table values (2016,10);
insert into your_table values (2017,5);
insert into your_table values (2018,15);
insert into your_table values (2019,20);
insert into your_table values (2020,30);
insert into your_table values (2021,0);
insert into your_table values (2022,-10);
insert into your_table values (2023,-5);
insert into your_table values (2024,1);
WITH initial_value AS (
SELECT 10 AS Initial_value FROM DUAL
)
SELECT YEAR,
initial_value * POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) ) AS "Initial Value",
PERC,
POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) ) AS "Previous Cumulative Multiplier",
initial_value * POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), 0 ) ) AS "Final Value"
FROM your_table
CROSS JOIN
initial_value
| YEAR | Initial Value | PERC | Previous Cumulative Multiplier | Final Value |
|------|---------------|------|--------------------------------|---------------|
| 2015 | 10 | 10 | 1 | 11 |
| 2016 | 11 | 10 | 1.1 | 12.1 |
| 2017 | 12.1 | 5 | 1.21 | 12.705 |
| 2018 | 12.705 | 15 | 1.2705 | 14.61075 |
| 2019 | 14.61075 | 20 | 1.461075 | 17.5329 |
| 2020 | 17.5329 | 30 | 1.75329 | 22.79277 |
| 2021 | 22.79277 | 0 | 2.279277 | 22.79277 |
| 2022 | 22.79277 | -10 | 2.279277 | 20.513493 |
| 2023 | 20.513493 | -5 | 2.0513493 | 19.48781835 |
| 2024 | 19.48781835 | 1 | 1.948781835 | 19.6826965335 |
:
create table your_table(year integer, perc integer );
insert into your_table values (2015, 10);
insert into your_table values (2016,10);
insert into your_table values (2017,5);
insert into your_table values (2018,15);
insert into your_table values (2019,20);
insert into your_table values (2020,30);
insert into your_table values (2021,0);
insert into your_table values (2022,-10);
insert into your_table values (2023,-5);
insert into your_table values (2024,1);
WITH initial_value AS (
SELECT 10 AS Initial_value FROM DUAL
)
SELECT YEAR,
initial_value * POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) ) AS "Initial Value",
PERC,
POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ), 0 ) ) AS "Previous Cumulative Multiplier",
initial_value * POWER( 10, COALESCE( SUM( LOG( 10, 1+PERC/100 ) ) OVER ( ORDER BY YEAR ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ), 0 ) ) AS "Final Value"
FROM your_table
CROSS JOIN
initial_value
| YEAR | Initial Value | PERC | Previous Cumulative Multiplier | Final Value |
|------|---------------|------|--------------------------------|---------------|
| 2015 | 10 | 10 | 1 | 11 |
| 2016 | 11 | 10 | 1.1 | 12.1 |
| 2017 | 12.1 | 5 | 1.21 | 12.705 |
| 2018 | 12.705 | 15 | 1.2705 | 14.61075 |
| 2019 | 14.61075 | 20 | 1.461075 | 17.5329 |
| 2020 | 17.5329 | 30 | 1.75329 | 22.79277 |
| 2021 | 22.79277 | 0 | 2.279277 | 22.79277 |
| 2022 | 22.79277 | -10 | 2.279277 | 20.513493 |
| 2023 | 20.513493 | -5 | 2.0513493 | 19.48781835 |
| 2024 | 19.48781835 | 1 | 1.948781835 | 19.6826965335 |
我发现这个问题非常有趣,我一直在执行以下公式的逻辑初始值*(1+PC1)*(1+PC2)(1+PC3)。。。。(1+PCn)产生最终值。但你确实很好奇,节省了我的时间。我尝试过使用OVER caluse求和(1+PC1),但这种逻辑是错误的。注:PC-百分比变化。查询工作正常。仅供参考,如果百分比变化为-100(日志0无效),则这可能不起作用。我将处理这种情况。谢谢,太好了。但“上一个累计乘数”列是错误的。从第三行开始。@FlorinGhita OP对于倒数第二列的内容非常不清楚。我将其理解为应用于起始值(2015年)的累积乘数,以获得今年的初始值(因此我在该列中命名)。对于我对OP要求的解释,我的答案中的值是正确的。您的回答似乎对本栏的含义有不同的解释-OP需要澄清他们对本栏的意图。@FlorinGhita-还为最终值的年度增量添加了一栏。哦,对不起。然而,你的回答非常好。向上投票!