[英]Join 3 or more tables with aggregate on one table based on date range
我有3张桌子,如下所示:
表policyTable
。
policy_id employee_id policy_start_date premium 1000001 2000001 2010-03-24 560.1 1000002 2000003 2013-11-01 865.6 1000023 2000201 2012-03-07 435.2 ... ... ...
表employeeTable
。
employee_id department_id job_title_key start_date end_date 2000001 5 1248 2009-05-01 2009-09-23 2000001 5 1248 2009-09-23 2010-02-01 2000001 3 1302 2010-02-01 2011-06-15 2000003 4 2054 2008-03-01 2009-05-12 2000003 4 2054 2009-05-12 2012-01-13 2000003 4 2054 2012-01-13 2014-02-09 2000003 7 5023 2014-02-09 NULL 2000201 2 3125 2010-03-06 2012-01-05 2000201 2 3125 2012-01-05 2013-08-07 2000201 5 1265 2013-08-07 2015-02-20 ...
表departmentTable
表:
department_id department_name 2 finance 3 accounting 4 software 5 sales 7 marketing ... ...
我的目标是加入这些表,以使每个策略的一个记录具有policy_id, employee_id, policy_start_date, premium, job_title_key, department_name
。 我现在的问题是employeeTable
,该表为每个雇员针对不同职位的多个记录。 我只需要为每位员工的每份保单获得一份记录。 标准是选择policy_start_date
介于雇员start_date
和end_date
之间的条件。
所以我最终想要的表是:
policy_id employee_id policy_start_date premium job_title_key department_name 1000001 2000001 2010-03-24 560.1 1302 accounting 1000002 2000003 2013-11-01 865.6 2054 software 1000023 2000201 2012-03-07 435.2 3125 finance ... ... ... ... ... ...
我尝试将SELECT AGGREGATE GROUP BY
与联接一起使用,但是每个未聚合的列都需要放入GROUP BY
,这对我来说不起作用。
SELECT p.policy_id, e.employee_id, p.policy_start_date, e.job_title_key, d.department_name
FROM policyTable p
INNER JOIN employeeTable e
on p.employee_id = e.employee_id
and p.policy_start_date between e.start_date
and CASE
WHEN e.end_date IS NULL THEN GETDATE()
ELSE e.end_date
END
INNER JOIN departmentTable d
on e.department_id = d.department_id
with order
(With Employee_correction as (select
employee_id , department_id , job_title_key , start_date ,
(case when end_date is null then GETDATE ( ) else end_date end) as end_date
from employeeTable)
select policy_id, employee_id ,
max(policy_start_date) as policy_start_date
from policyTable a
join Employee_correction b on a.employee_is=b.employee_id
and policy_start_date between start_date and end_date group by policy_id, employee_id )
select c.policy_id ,c.employee_id ,c.policy_start_date,c.job_title_key,premium,department_name from employeeTable c
join order on order.policy_id=c.policy_id
and order.employee_id=c.employee_id
and order.policy_start_date=c.policy_start_date
join policyTable d on
order.policy_id=d.policy_id and
order.employee_id=d.employee_id
and order.policy_start_date=d.policy_start_date
join departmentTable e on c.department_id=e.department_id
我对Employee进行了更正,假设最大日期为null时,则日期为今天。 此外,为避免重复,我在日期上进行了最大汇总。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.