繁体   English   中英

SQL按不相关的日期联接两个表

[英]SQL Join two tables by unrelated date

我正在寻找联接不具有公共数据点,但具有公共值(日期)的两个表。 我想要一个表,列出该日期的日期和雇用/终止的雇员总数。 示例如下:

表格1

Hire Date   Employee Number   Employee Name
--------------------------------------------
5/5/2018         10078          Joe
5/5/2018         10077          Adam
5/5/2018         10078          Steve
5/8/2018         10079          Jane
5/8/2018         10080          Mary

表2

Termination Date    Employee Number   Employee Name
----------------------------------------------------
  5/5/2018                10010         Tony
  5/6/2018                10025         Jonathan
  5/6/2018                10035         Mark
  5/8/2018                10052         Chris
  5/9/2018                10037         Sam

所需结果:

Date    Total Hired Total Terminated
--------------------------------------
5/5/2018      3             1
5/6/2018      0             2
5/7/2018      0             0
5/8/2018      2             1
5/9/2018      0             1

从“添加”日期列的角度来看,获取总数很容易,只是不确定是最佳方法

如果需要某个窗口中的所有日期,则需要将数据添加到日历中。 然后,您可以保留数据点的联接和求和标志。

DECLARE @StartDate DATETIME = (SELECT MIN(ActionDate) FROM(SELECT ActionDate = MIN(HireDate) FROM Table1 UNION SELECT ActionDate = MIN(TerminationDate) FROM Table2)AS X) 
DECLARE @EndDate DATETIME = (SELECT MAX(ActionDate) FROM(SELECT ActionDate = MAX(HireDate) FROM Table1 UNION SELECT ActionDate = MAX(TerminationDate) FROM Table2)AS X) 

;WITH AllDates AS
(
    SELECT CalendarDate=@StartDate
    UNION ALL
    SELECT   DATEADD(DAY, 1, CalendarDate) 
    FROM AllDates 
    WHERE DATEADD(DAY, 1, CalendarDate) <= @EndDate
)


SELECT
    CalendarDate,
    TotalHired = SUM(CASE WHEN H.HireDate IS NULL THEN NULL ELSE 1 END),
    TotalTerminated  = SUM(CASE WHEN T.TerminationDate IS NULL THEN NULL ELSE 1 END)
FROM
    AllDates D
    LEFT OUTER JOIN Table1 H ON H.HireDate = D.CalendarDate
    LEFT OUTER JOIN Table2 T ON T.TerminationDate = D.CalendarDate
/* If you only want dates with data points then uncomment out the where clause
 WHERE
    NOT (H.HireDate IS NULL AND T.TerminationDate IS NULL) 
*/
 GROUP BY
    CalendarDate

我会用做union all和聚合:

select dte, sum(is_hired) as num_hired, sum(is_termed) as num_termed
from (select hiredate as dte, 1 as is_hired, 0 as is_termed from table1
      union all
      select terminationdate, 0 as is_hired, 1 as is_termed from table2
     ) ht
group by dte
order by dte;

这不包括“缺失”日期。 如果需要,可以使用日历或递归CTE。 例如:

with ht as (
      select dte, sum(is_hired) as num_hired, sum(is_termed) as num_termed
      from (select hiredate as dte, 1 as is_hired, 0 as is_termed from table1
            union all
            select terminationdate, 0 as is_hired, 1 as is_termed from table2
           ) ht
      group by dte
     ),
     d as (
      select min(dte) as dte, max(dte) as max_dte)
      from ht
      union all
      select dateadd(day, 1, dte), max_dte
      from d
      where dte < max_dte
     )
select d.dte, coalesce(ht.num_hired, 0) as num_hired, coalesce(ht.num_termed) as num_termed
from d left join
     ht
     on d.dte = ht.dte
order by dte;

试试这个

SELECT ISNULL(a.THE_DATE, b.THE_DATE) as Date, 
    ISNULL(a.Total_Hire,0) as Total_Hire, 
    ISNULL (b.Total_Terminate,0) as Total_terminate
FROM (SELECT Hire_date as the_date, COUNT(1) as Total_Hire 
    FROM TABLE_HIRE GROUP BY HIRE_DATE) a
FULL OUTER JOIN (SELECT Termination_Date as the_date, COUNT(1) as Total_Terminate 
        FROM TABLE_TERMINATE GROUP BY HIRE_DATE) a
    ON a.the_date = b.the_date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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