【问题标题】:Select last salary选择最后的薪水
【发布时间】:2017-02-16 04:49:29
【问题描述】:

我有两个表(我的例子):

TB1

Emp_code     salary     year   month 
-------      -----      ----   -----
1             2000       2015   1
1             2000       2015   2 
2             4000       2015   2
2             4000       2015   3

TB2

code          name       Age 
-------      -----      ----   
1             MMMM       32
1             MMMM       32 
2             KKKK       25   
2             KKKK       25   

我需要选择最后(月和年)获得工资>>

结果应该如下表所示>>

code          name       Age    salary   year   month
-------      -----      ----    ------   ----   -----
1             MMMM       32      2000    2015     2
2             KKKK       25      4000    2015     3

【问题讨论】:

  • 为什么你的数据有这么多重复项?这似乎是一个糟糕的数据结构。

标签: sql sql-server sql-server-2008


【解决方案1】:
SELECT *
FROM ( 
       SELECT t1.code,
              t2.name,
              t2.Age,
              t1.salary,
              t1.year,
              t1.month,
              ROW_NUMBER OVER(PARTITION BY t1.Emp_code ORDER BY t1.year desc,t1.month desc) AS RN 
       FROM TB1 t1
       INNER JOIN TB2 t2 ON t1.Emp_code=t2.code
                                                 ) X
WHERE X.RN=1

【讨论】:

    【解决方案2】:

    为员工和工资表创建脚本

    CREATE TABLE [dbo].[Employee](
    [Empcode] [varchar](50) NULL,
    [Name] [varchar](50) NULL,
    [Age] [varchar](50) NULL) ON [PRIMARY]
    
    
    CREATE TABLE [dbo].[Salary](
    [Empcode] [varchar](50) NULL,
    [Salary] [varchar](50) NULL,
    [Year] [varchar](50) NULL,
    [Month] [varchar](50) NULL
    ) ON [PRIMARY]
    

    工资表数据

    1   10000   2017    1
    1   10000   2017    2
    2   40000   2017    2
    2   40000   2017    3
    

    员工表数据

    1   aaa 25
    2   bbb 25
    

    查询:-

    select e.empcode,e.name,e.age,s.salary,max(s.year) as year,max(s.month) as month from salary s join employee e on s.empcode=e.empcode group by e.empcode,e.name,e.age,s.salary
    

    输出:-

    1   aaa 25  10000   2017    2
    2   bbb 25  40000   2017    3
    

    【讨论】:

    • 1 10000 2017 1 1 10000 2016 12
    • 这个解决方案在同一年,但如果不同年
    【解决方案3】:

    使用窗口函数和distinct:

    select . . .
    from (select tb1.*,
                 row_number() over (partition by emp_code order by year desc, month desc) as seqnum
          from tb1
         ) tb1 join
         (select distinct tb2.*
          from tb2
         ) tb2
         on tb1.code = tb2.emp_code;
    

    【讨论】:

      【解决方案4】:
      Try below statements to get your desired result ;      
      
      CREATE TABLE #Table(Emp_code INT,salary INT,_year INT,  _month INT)
      CREATE TABLE #Table1(code INT,name VARCHAR(100), Age INT)
      
      INSERT INTO  #Table(Emp_code ,salary , _year ,   _month)
      SELECT 1,2000,2015,1 UNION ALL
      SELECT 1,2000,2015,2 UNION ALL 
      SELECT 2,4000,2015,2 UNION ALL
      SELECT 2,4000,2015,3
      
      INSERT INTO  #Table1(code ,name , Age)
      SELECT 1,'MMMM',32 UNION ALL
      SELECT 1,'MMMM',32 UNION ALL 
      SELECT 2,'KKKK',25 UNION ALL
      SELECT 2,'KKKK',25 
      
      SELECT DISTINCT code ,name , Age , salary , _year , A._month
      FROM #Table1
      JOIN
      (
        SELECT Emp_code ,MAX(_month) _month
        FROM #Table
        GROUP BY Emp_code 
      ) A ON Emp_code = code  
      JOIN #Table T ON A.Emp_code = T.Emp_code AND A._month = T._month
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多