使用奖金计算运行总金额

问题描述

我有下表:

create table test_table
(
   employee_id integer,salary_year integer,raise_in_salary_perentage decimal(18,2),annual_salary decimal(18,2)
);

**测试数据如下:**

insert into test_table values ( 1,2016,100); 
insert into test_table values ( 1,2017,10,2018,2019,2020,100); 
insert into test_table values ( 2,100); 

我正在尝试实现以下输出

enter image description here

累积薪水应包括每名雇员多年来的年薪总和。 每年都有加薪的百分比,因此,如果本年度加薪,则累计薪金将为以前的薪金加上加薪所得。

我尝试使用下面的sql来实现它,但是结果确实正确。会很感激的。

SELECT *,sum(annual_salary) OVER (
        PARTITION BY employee_id ORDER BY salary_year ROWS BETWEEN UNBOUNDED PRECEDING
                AND CURRENT ROW
        ) AS cummulative_salary,(
        sum(annual_salary) OVER (
            PARTITION BY employee_id ORDER BY salary_year ROWS BETWEEN UNBOUNDED PRECEDING
                    AND CURRENT ROW
            )
        ) + (
        sum(annual_salary) OVER (
            PARTITION BY employee_id ORDER BY salary_year ROWS BETWEEN UNBOUNDED PRECEDING
                    AND CURRENT ROW
            )
        ) * (
        sum(raise_in_salary_perentage) OVER (
            PARTITION BY employee_id ORDER BY salary_year ROWS BETWEEN UNBOUNDED PRECEDING
                    AND CURRENT ROW
            ) / 100
        ) AS csalary
FROM test_table;

解决方法

根据您的描述,工资的增加应该是累积的。但是,给定年份的增长不应影响往年。

这不是您想要的结果所显示的。根据我的解释,我认为您想要:

with recursive cte as (
      select employee_id,salary_year,(t.annual_salary * (1 + raise_in_salary_perentage / 100.0))::numeric(18,2) as annual_salary,raise_in_salary_perentage,2) as total
      from test_table t
      where salary_year = 2016
      union all
      select t.employee_id,t.salary_year,(cte.annual_salary * (1 + t.raise_in_salary_perentage / 100.0))::numeric(18,2),t.raise_in_salary_perentage,(cte.total + cte.annual_salary * (1 + t.raise_in_salary_perentage / 100.0))::numeric(18,2)
      from cte join
           test_table t
           on t.employee_id = cte.employee_id and t.salary_year = cte.salary_year + 1
     )
select *
from cte
order by employee_id,salary_year;

cloud debugging是db 小提琴。