Sql Server 2008 사용. 작업 테이블이 있습니다. 일반적으로 모든 고객의 경우 job # 1 다음에 job # 2가 이어지고 job # 3이 이어집니다.
CustNum, JobDate, TypeJob
100, 4/10/2019, 2
100, 4/11/2019, 1
100, 4/12/2019, 2
100, 4/13/2019, 3
100, 4/13/2019, 3
222, 4/10/2019, 2
222, 4/11/2019, 1
333, 4/11/2019, 2
444, 3/1/2019, 3
444, 4/10/2019, 1
444, 4/11/2019, 2
날짜> 작업 # 1 (모두 기존) 인 작업 # 2를 가진 모든 고객을 찾고 있지만 나중에 작업 # 3이 입력되지 않았습니다.
여기 내가 한 일이 있고 작동하지만 서투른 것 같습니다.
Select
L.CustNum,
L.JobDate1,
L.JobDate2,
R.JobDate3
From
(
--A<B has JobDate1 followed by JobDate2
Select
First.CustNum as [CustNum],
First.JobDate as JobDate1,
Second.JobDate as JobDate2
From
(
Select [CustNum], Max([JobDate]) as JobDate From tbJobs
Where [TypeJob] = 1
Group by CustNum
) First
Join
(
Select [CustNum], Max([JobDate]) as JobDate From tbJobs
Where [TypeJob] = 2
Group by CustNum
) Second
On First.CustNum = Second.CustNum
Where Second.JobDate > First.JobDate
) L
Left Outer Join
(
--A<B #and# C>A has JobDate1 followed by JobDate2 and JobDate3
Select
First.CustNum as [CustNum],
--First.JobDate as JobDate1,
--Second.JobDate as JobDate2,
Third.JobDate as JobDate3
From
(
Select [CustNum], Max([JobDate]) as JobDate From tbJobs
Where [TypeJob] = 1
Group by CustNum
) First
Join
(
Select [CustNum], Max([JobDate]) as JobDate From tbJobs
Where [TypeJob] = 2
Group by CustNum
) Second
On First.CustNum = Second.CustNum
Join
(
Select [CustNum], Max([JobDate]) as JobDate From tbJobs
Where [TypeJob] = 3
Group by CustNum
) Third
On Second.CustNum = Third.CustNum
Where Third.JobDate > First.JobDate
And Second.JobDate > First.JobDate
) R
On First.CustNum = Third.CustNum
Where JobDate3 is null
Order by CustNum
제가 정말로하고 싶은 것은 다음과 같습니다.
Select ... From
(Select ...) First
Join
(Select ...) Second
Left Outer Join
(Select ...) Third
On ...
Where Second.JobDate > First.JobDate
And (Third.JobDate > First.JobDate) is null
Third.JobDate <= First.JobDate를 무시하고 Third.JobDate (First.JobDate보다 큼)가 null 인 행만 찾을 수 있도록 Where 문을 어떻게 공식화합니까?
SQL Server 2008 사용.
간단한 집계 쿼리가 여기에서 작동합니다.
WITH cte AS (
SELECT
CustNum,
MAX(CASE WHEN TypeJob = 1 THEN JobDate END) AS date1,
MAX(CASE WHEN TypeJob = 2 THEN JobDate END) AS date2,
MAX(CASE WHEN TypeJob = 3 THEN JobDate END) AS date3
FROM tbJobs
GROUP BY CustNum
)
SELECT CustNum
FROM cte
WHERE
COALESCE(date2, date1) > COALESCE(date1, date2) AND
(date3 < date2 OR date3 IS NULL);
절 COALESCE
에서를 사용 HAVING
하면 고객이 첫 번째 날짜와 두 번째 날짜가 모두있는 경우에만 통과 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다