Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算带奖金的跑步总金额_Sql_Psql_Postgresql 9.5 - Fatal编程技术网

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英镑?谢谢戈登,这个解决方案是正确的,很抱歉我没能正确解释。