繁体   English   中英

根据日期范围将3个或更多表合计为一个表

[英]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_dateend_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 ,这对我来说不起作用。

SQL小提琴演示

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM