SQL查询来获取部门与开始日期和结束日期
我有如下因素的数据表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
我认为这会做你想要什么:
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
,但相关子查询的罚款。
我不太确定这是如何工作,但它是。如果ED.StartDate大于OT.TransDate,此查询是否忽略DESC? – BobNoobGuy 2014-09-22 23:47:09
@BobNoobGuy。 。 。如果没有行匹配第一个条件,那么对于排序顺序,所有行都被赋予相同的值(NULL)。第二个条件然后用于排序。 – 2014-09-23 01:59:36
您的查询有什么问题? – 2014-09-22 23:28:20
由于事务日期不在startdate和enddate之间,因此我得到OrderID为2323的NULL Dept。 – BobNoobGuy 2014-09-22 23:29:49
你期望得到什么?那天没有有效的部门。 – 2014-09-22 23:32:55