表A

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


从6月10日起将跟踪Calid 2,从11月20日起将跟踪calid 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的所有工作日期。如表A所示,将生成一个报告,以查找跟随calid的人的总工作日。报告应包含以下日期:
卡利德|日期(来自表B)。
这可以通过select语句来实现(因为它是视图的一部分,所以无需过程)。在表A中,我没有有效的日期栏。



细节:
表B包含给定年份的所有工作日(读取日期)。 Calid是特定日历的日历ID。说calid 2表示日本所有工作日的清单,而Calid 5给出该清单在迪拜一年的所有工作日/日期的清单。一名员工从日本到迪拜迁移到不同的地点,因此他/她的工作日会相应更改。在年底,要计算该雇员应工作多少天。
表A包含一年中员工日历移动的历史记录。在员工移动到另一个地点并开始遵循其他地点日历的当天添加了一个条目。 EffectiveFrom告诉您遵循特定日历的日期。
该逻辑将与视图中的其他代码放在一起,以便完整保留视图的限制。

我已经对问题进行了编辑,以使其清楚,如@philipxy所评论。

最佳答案

终于我明白了 ! 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

关于mysql - 限制mysql中的内部联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42287762/

10-13 22:11
查看更多