问题描述
我有下表:
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);
我正在尝试实现以下输出:
累积薪水应包括每名雇员多年来的年薪总和。 每年都有加薪的百分比,因此,如果本年度加薪,则累计薪金将为以前的薪金加上加薪所得。
我尝试使用下面的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 小提琴。