2014-09-22 70 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

相關問題