I have a table EMPDATA with the following data:
EntityId MeetDate SourceCode Status
1 06.11.2017 AB FNL
1 05.2.2018 AB
@Anita, I coudn't provide answer your latest question "Finding max date with different conditions [duplicate]" due to set as duplicate question. You can try the following query
SELECT B.EntityId,A.Eligibility,A.MeetDate,B.LastDate, B.InterimDate,
(CASE WHEN A.Eligibility=1 THEN DATEADD(MONTH,6,A.MeetDate) ELSE DATEADD(Month,4,A.MeetDate) END) AS BusinessDate FROM StackTable A
INNER JOIN
(SELECT EntityId,
MAX(CASE
WHEN SourceCode = 'AB' AND status = 'FNL' THEN MeetDate
END) AS LastDate,
MAX(CASE WHEN SourceCode = 'IU' THEN MeetDate END) AS InterimDate
FROM StackTable
GROUP BY EntityId) B
ON A.EntityId=B.EntityId AND A.MeetDate = B.LastDate
You can easily achieve the expected output using conditional aggregation:
SELECT EntityId,
MAX(CASE
WHEN SourceCode = 'AB' AND status = 'FNL' THEN MeetDate
END) AS LastDate,
MAX(CASE WHEN SourceCode = 'IU' THEN MeetDate END) AS InterimDate
FROM mytable
GROUP BY EntityId
This query implements all logic described in the OP except for:
InterimDate
... which has occurred after the latest Meetdate
for SourceCode
‘AB’ and Status ‘FNL’.You can implement this using a CTE
so that the code looks cleaner:
;WITH CTE AS (
SELECT EntityId,
MAX(CASE
WHEN SourceCode = 'AB' AND status = 'FNL' THEN MeetDate
END) AS LastDate,
MAX(CASE WHEN SourceCode = 'IU' THEN MeetDate END) AS InterimDate
FROM mytable
GROUP BY EntityId
)
SELECT LastDate,
CASE
WHEN InterimDate > LastDate THEN InterimDate
END AS InterimDate
FROM CTE
Demo here