Sql 计算带奖金的跑步总金额
我有以下表格:Sql 计算带奖金的跑步总金额,sql,psql,postgresql-9.5,Sql,Psql,Postgresql 9.5,我有以下表格: 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, 0 , 100); insert into test_table
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, 0 , 100);
insert into test_table values ( 1,2017, 10, 100);
insert into test_table values ( 1,2018, 10, 100);
insert into test_table values ( 1,2019, 0, 100);
insert into test_table values ( 1,2020, 10, 100);
insert into test_table values ( 2,2016, 10 , 100);
insert into test_table values ( 2,2017, 10, 100);
insert into test_table values ( 2,2018, 0, 100);
insert into test_table values ( 2,2019, 0, 100);
insert into test_table values ( 2,2020, 0, 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,
(t.annual_salary * (1 + raise_in_salary_perentage / 100.0))::numeric(18, 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;
大多数人不会直接在sql中执行这样的任务,而是将数据查询到他们选择的语言(Python、PHP、Java…)中并在那里进行处理。我没有得到结果。为什么第二排是220而不是210?也就是说,第一年100英镑,第二年110英镑?谢谢戈登,这个解决方案是正确的,很抱歉我没能正确解释。