我可能不明白CROSS APPLY的完整用法,所以我希望有人能帮我解决这个问题。
表格如下所示:
MARK STAFF_RESOURCE PLACING
---- -------------- -------
ACCOUNT_DAY EMPLOYNO RES_ID
MARK_TIME RES_ID PLAC_ID
MARK_TYPE
PLAC_ID
MARK -表有这样的数据:
ACCOUNT_DAY MARK_TIME MARK_TYPE PLAC_ID
-----------------------------------------------------------
2015-02-05 2015-02-05 13:02:01.029 1 5
2015-02-05 2015-02-05 18:32:21:744 2 5
2015-02-06 2015-02-06 09:02:01.029 1 5
2015-02-06 2015-02-06 14:32:21:744 2 5
如果在ACCOUNT_DAY(例如 2 月)上进行范围选择,我想要的结果看起来像 - 这通过ID连接表:
EMPLOYNO ACCOUNT_DAY MARK_TIME (1) MARK_TIME (2)
----------------------------------------------------------------------------
03064 2015-02-05 2015-02-05 13:02:01.029 2015-02-05 18:32:21:744
03064 2015-02-06 2015-02-06 09:02:01.029 2015-02-06 14:32:21:744
使用MARK_TIME字段下方的代码时,显示错误数据。我必须在某处使用JOIN才能正确吗?
SELECT DISTINCT stf.EMPLOYNO, A.ACCOUNT_DAY, sta.MARK_TIME, stp.MARK_TIME
FROM SYSADM.STAFF_RESOURCE AS stf
CROSS APPLY
(
SELECT PLAC_ID
FROM SYSADM.PLACING AS plc
WHERE stf.RES_ID = plc.RES_ID
)C
CROSS APPLY
(
SELECT mrk.ACCOUNT_DAY, mrk.PLAC_ID
FROM SYSADM.MARK AS mrk
WHERE mrk.PLAC_ID = C.PLAC_ID AND (mrk.ACCOUNT_DAY >= CONVERT(DATETIME, '2015-02-01', 102)) AND (mrk.ACCOUNT_DAY < CONVERT(DATETIME, '2015-02-28', 102))
) A
CROSS APPLY
(
SELECT MARK_TIME
FROM SYSADM.MARK AS sta
WHERE (MARKTYPE = '1') AND (sta.PLAC_ID = C.PLAC_ID) AND (A.ACCOUNT_DAY >= '2015-02-01 00:00:00.000') AND (A.ACCOUNT_DAY <= '2015-02-01 23:59:59.999')
) sta
CROSS APPLY
(
SELECT MARK_TIME
FROM SYSADM.MARK AS stp
WHERE (MARKTYPE = '2') AND (stp.PLAC_ID = C.PLAC_ID) AND (stp.MARK_TIME >= '2015-02-01 00:00:00.000') AND (stp.MARK_TIME <= '2015-02-01 23:59:59.999')
) stp