【问题标题】:Case to get if the employee doesn't have an active employer, then give me a null employer如果员工没有活跃的雇主,则给我一个空雇主的案例
【发布时间】:2021-03-16 07:30:41
【问题描述】:

我有三个表:Employee、Employer 和 Employer History。如果他们有有效的全职记录,我正在寻找一份员工名单,以及他们最近的全职雇主。

假设我有以下就业历史表:

Employee ID | Employer ID | Start Date | End Date  | Status
---------------------------------------------------------------
  1         |  AA         |  1/1/2019  |           | Part-Time
  1         |  BB         |  1/1/2000  |           | Full-Time
  2         |  CC         |  3/1/2019  |           | Part-Time
  2         |  DD         |  3/1/2000  | 5/15/2021 | Full-Time

以及 ID 为 1、2 和 3 的员工。

我从这里开始:

select employee.id, employer.id 
from Employee employee left join EmploymentHistory eh on eh.employeeId = employee.id 
left join Employer employer on eh.employerId = employer.id

但我不知道该员工是否没有在职雇主,然后给我一个空雇主 ID。如果他们有一个有效的(如无结束日期)全职工作历史记录,给我最近的,如果他们没有有效的全职记录,那么给我最近的部分-第一次。

我开始进入带有子查询的循环,并尝试根据最大开始日期进行选择,但我有点转过身来。

最后,我希望结果看起来像这样:

Employee ID | Employer ID 
---------------------------
  1         |  BB         |
  2         |  CC         |
  3         |  <null>     |

这可能吗?

【问题讨论】:

  • 仅供参考 case 是一个表达式而不是一个语句

标签: sql sql-server tsql


【解决方案1】:

您可以尝试OUTER APPLY 和一个子查询,该子查询根据就业的类型和结束时间获取每个员工的最高记录。

SELECT e.id,
       x.employerid
       FROM employee e
            OUTER APPLY (SELECT TOP 1
                                eh.employerid
                                FROM employmenthistory eh
                                WHERE eh.employeeid = e.id
                                      AND eh.status IN ('Full-Time',
                                                        'Part-Time')
                                ORDER BY eh.status ASC,
                                         eh.enddate DESC) x;

【讨论】:

  • 我需要仔细检查我的退货结果,但在第一次检查时,看起来这样可以解决问题。
【解决方案2】:

如果他们有有效的全职记录,我正在寻找一份员工名单,以及他们最近的全职雇主。

你可以只使用一张桌子:

select eh.*
from (select eh.*,
             row_number() over (partition by employee_id order by startdate desc) as seqnum
      from EmploymentHistory eh
      where status = 'Full-Time'
     ) eh
where seqnum = 1;

【讨论】:

  • 如果没有全职记录,那给我兼职记录,给我没有任何雇佣历史记录的员工?
  • @Risu 你为什么不试试看?
  • @DaleK,我已经按照你的建议尝试过了,我返回的所有记录都只是全职。
  • @Risu 。 . .不,因为这不是问题要问的:“我正在寻找一份员工名单,以及他们最近的全职雇主,如果他们有活跃的全职记录的话。”这回答了您提出的实际问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2017-06-24
  • 1970-01-01
  • 2020-04-07
  • 2015-02-16
相关资源
最近更新 更多