首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL中的增量总计

Oracle SQL中的增量总计
EN

Stack Overflow用户
提问于 2015-09-03 05:41:39
回答 2查看 220关注 0票数 1

在编写计算增量总计的SQL查询时,我需要帮助。

例如,2015年的初始值为10,按年计算有百分比的变化。我需要每年的总价值。简单来说,若定期存款为10元,而利息每年均有变动,按年计算的总累积价值是多少?

代码语言:javascript
复制
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                                      

在表中只计算前两个步骤。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-03 11:01:03

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
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);

查询1

代码语言:javascript
复制
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

结果

代码语言:javascript
复制
| 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 |
票数 2
EN

Stack Overflow用户

发布于 2015-09-03 09:42:42

这可以使用递归的CTE(公共表表达式)来完成。

初始载荷:

代码语言:javascript
复制
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);

现在计算:

代码语言:javascript
复制
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
  ;

SQLFIDDLE

结果:

代码语言:javascript
复制
| 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 |
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32367758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档