Oracle SQL中的增量总计

Oracle SQL中的增量总计,sql,oracle,Sql,Oracle,我需要帮助编写SQL查询以计算增量总计 例如,对于2015年,初始值为10,同比变化百分比。我需要每年的总价值。简单地说,一笔10英镑的定期存款,每年的利息都会发生变化,那么每年的累计总价值是多少呢 Year Initial Deposit Change Percent Change Value Final Value ---- ----------------- -------------- ------------ ----------- 2015 Initi

我需要帮助编写SQL查询以计算增量总计

例如,对于2015年,初始值为10,同比变化百分比。我需要每年的总价值。简单地说,一笔10英镑的定期存款,每年的利息都会发生变化,那么每年的累计总价值是多少呢

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-还为最终值的年度增量添加了一栏。哦,对不起。然而,你的回答非常好。向上投票!