在mysql

时间:2017-02-17 01:23:03

标签: mysql sql inner-join

表A

Calid |        EffectiveFrom  
---
2       |     10 Jun 2016
---
5       |     20 Nov 2016
------
7       |    05 Jan 2017
--

Calid 2将于6月10日起由一个人跟随,从11月20日开始,5个人将被跟踪,等等....

表B包含calid的详细信息(所有工作日期)。

Table B 
CAlid  |  WorkingDate
2      |  1 Jan 2016
2      |  2 Jan 2016
2      |  4 Jan 2016 till 31 Dec all working dates are present
5      |  1 Jan 2016
5      |  2 Jan 2016
5      |  3 Jan 2016
5      |  5 Jan 2016 till 31 dec all working dates are present

等等所有工作日期均为calid 7。将生成一份报告,以查找跟随calid的人的总工作日,如表A所示。报告应包含类似的天数 Calid |日期(来自表B)。 这是通过select语句实现的(没有过程,因为它是视图的一部分)。在表A中,我没有有效的日期列。

详细说明: 表B包含给定年份的所有工作日(读取日期)。 Calid是特定日历的日历ID。说calid 2表示日本所有工作日的清单,Calid 5列出迪拜一年的所有工作日/日期。一名员工从日本到迪拜的不同地点移动,因此他/她的工作日也相应改变。在年底,计算员工应该工作的天数。 表A包含一年中员工日历移动的历史记录。在员工移动到另一个位置并开始关注不同位置日历的那一天添加一个条目。 EffectiveFrom指示遵循特定日历的日期。 这段逻辑将与视图中的另一个代码放在一起,因此视图的限制是完整的。

我编辑了这个问题,以便在@philipxy评论时明确表示。

1 个答案:

答案 0 :(得分:0)

最后我明白了! CTE

WITH Cte (EmpNo, calid, dtEffectiveDate,number)AS
         (SELECT EmpNo, calid, dtEffectiveDate,row_number() over(order by EmpNo,dtEffectiveDate)
               FROM TableA WHere EmpNo in (1741285 ) 
         )
         , OuterCte (EmpNo, calid, dtEffectiveDate,number,dtEffectiveToDate) As
         (Select d.*,IsNull(d2.dteffectiveDate-1,Convert(Date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 2, -1)) ) as dtEffectiveToDate
           from Cte d
           left outer join Cte d2 on d.number = (d2.number-1)
         )
    SELECT  EmpNo,WorkingDate,WorkingDescription
    FROM      OuterCte CAL  ON ELA.EmpNo = CAL.EmpNo        
    INNER JOIN TableB HCD WITH(NOLOCK)    ON HCD.calid = CAl.calid
    AND  HCD.dtHolidayDate between cal.dtEffectiveDate and cal.dtEffectiveToDate