2014-09-22 72 views
0

我有如下因素的数据表EMPDEPT:SQL查询来获取部门与开始日期和结束日期

EmployeeID Dept StartDate  EndDate 
JON001  PP 15-JUN-2013 13-AUG-2013 
JON001  AA 14-AUG-2013 NULL 

而且我有顺序表

OrderID TransactionDate EmployeeID 
2323  2-JUN-2012  JON001 
2324  23-JUN-2013 JON001 
2325  2-AUG-2014  JON001 

而且我想加入这两个表得到以下

OrderID TransactionDate EmployeeID DEPT 
2323  2-JUN-2012  JON001  PP 
2324  23-JUN-2013 JON001  PP 
2325  2-AUG-2014  JON001  AA 

通知orderid 2323交易日期小于最小开始日期 和JON001的当前部门没有结束日期。 基本上,如果交易日期小于最小值startdate,那么min startdate应该是开放的。

如何做到以上?

这是我到目前为止,但由于交易日期不在startdate和enddate之间,因此我为OrderID 2323取NULL。

SELECT OT.OrderID 
    ,OT.TransactionDate 
    ,OT.EmployeeID 
    , (
     SELECT TOP 1 Dept FROM EmpDept ED WHERE ED.EmployeeID=OT.employeeID 
     AND OT.trans_date BETWEEN ED.StartDate AND 
     CASE 
      WHEN isnull(ED.EndDate,0)=0 THEN dateadd(year,50,ED.StartDate) 
     END 
    ) "Dept" 
    FROM OrderTable OT 
+0

您的查询有什么问题? – 2014-09-22 23:28:20

+0

由于事务日期不在startdate和enddate之间,因此我得到OrderID为2323的NULL Dept。 – BobNoobGuy 2014-09-22 23:29:49

+0

你期望得到什么?那天没有有效的部门。 – 2014-09-22 23:32:55

回答

0

我认为这会做你想要什么:

SELECT OT.* 
    (SELECT TOP 1 Dept 
     FROM EmpDept ED 
     WHERE ED.EmployeeID = OT.employeeID 
     ORDER BY (CASE WHEN ED.StartDate <= OT.transDate THEN ED.StartDate END) DESC, 
       ED.StartDate ASC 
    ) Dept 
FROM OrderTable OT; 

你也可以使用这种利用CROSS APPLY,但相关子查询的罚款。

+0

我不太确定这是如何工作,但它是。如果ED.StartDate大于OT.TransDate,此查询是否忽略DESC? – BobNoobGuy 2014-09-22 23:47:09

+0

@BobNoobGuy。 。 。如果没有行匹配第一个条件,那么对于排序顺序,所有行都被赋予相同的值(NULL)。第二个条件然后用于排序。 – 2014-09-23 01:59:36

相关问题