【问题标题】:How to write query for the cumulative salary for each employee within each year如何编写查询每个员工每年的累计工资
【发布时间】:2021-01-20 08:17:39
【问题描述】:

此表有列员工、月、年和薪水。 我需要为此编写 sql 查询。 当我们到达 12 月时它应该会重置,并重新开始计算同一员工明年的运行薪水。

现在我可以在查询下面写,但这还不够:

SELECT Employee, Month, Year, Salary, SUM(Salary)  OVER(ORDER BY rownum) AS "CUM SALARY"
FROM emp
group by Employee, Month, Year, Salary,rownum;

【问题讨论】:

  • 请标记您正在使用的数据库,并让我知道您的表格中的哪个日期列,我们可以通过它对行进行排序。
  • 它的 SQL 数据库。表创建查询:CREATE TABLE emp (Employee varchar(255), Month varchar(255), Year int, Salary int);
  • 插入查询:INSERT INTO emp VALUES('A','Jan','2016','2000'); INSERT INTO emp VALUES('A','Feb','2016','2000'); INSERT INTO emp VALUES('A','Mar','2016','2000');像这样的东西。
  • 那我们怎么下单呢?存储月份名称是不好的做法。
  • “SQL”是一种查询语言,而不是数据库产品。每个关系数据库都是一个“SQL 数据库”。 Why should I tag my DBMS

标签: sql cumulative-sum


【解决方案1】:

我不知道您使用的是哪个数据库,但这将在 Oracle 数据库中工作

SELECT Employee, Month, Year, Salary, SUM(Salary)  OVER(partition by Employee, Year ORDER BY to_date(Year||Month, 'YYYYMon', 'nls_date_language = english')) AS "CUM SALARY"
FROM emp
;

【讨论】:

  • 很高兴看到我能帮上忙
【解决方案2】:

可以如下使用求和解析函数:

select t.*,
       sum(salary) over (partition by empployee, year 
                          order by case month when 'Jan' then 1
                                              when 'Feb' then 2
                                              .....
                                              when 'Dec' then 12
                                   end) as cum_sal
  from employee t

或者你可以使用try_cast如下:

select t.*,
       sum(salary) over (partition by empployee, year 
                          order by TRY_CAST (concat(month,' ', year)) as cum_sal
  from employee t

【讨论】:

    【解决方案3】:

    示例查询

    WITH CTE
    AS(
    SELECT 
        EmpName,
        Sal_Date,  
        Salary, 
        (ROW_NUMBER() over (PARTITION BY YEAR(Sal_Date) order by EmpName,Sal_Date asc) ) ROWNO      
    FROM tbl_EmpTB
    GROUP BY EmpName,Sal_Date, Salary
    )
    
    SELECT EmpName,Datename(MONTH,sal_date) [Month],YEAR(sal_date) [YEAR],Salary,--CUMSAL,
    SUM (Salary) OVER (PARTITION BY YEAR(Sal_Date) order by EmpName,Sal_Date asc) [CUM SALARY]
    FROM CTE
    ORDER BY Sal_Date
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多