I am running into walls at the moment trying to write statements that would return specific records in a table that may have some duplicated unique value (Employee ID). Please see below for example: (The table below was imported using a saved import and all fields are in ShortText data type and there’s no PK or indexes setup when imported)
EMPID | ActNumber | Status | ReqDate | LastDateChange |
---|---|---|---|---|
123 | 185236 | Closed | 02/01/2019 | 01/01/2020 |
123 | 210390 | Open | 01/01/2020 | |
123 | 312395 | Closed | 01/01/2020 | |
432 | 832102 | Open | 06/01/2020 | |
313 | 921235 | Closed | 03/03/2020 | 05/01/2020 |
313 | 952305 | Closed | 03/03/2020 | |
610 | 182349 | Closed | 11/01/2018 |
The requirement would be to create a report that returns the records using the following criteria in order:
- Max(CDate([ReqDate]))
- [Status]
- If duplicate EMPID records found then take Open [Status]
- If duplicate EMPID records found but only Closed [Status] then return the one where [LastDateChange] is not null
The only way I can think of doing this is through multiple statements:
- One to return the Max [ReqDate] with [Status] Open
- One to return the Max [ReqDate] with another statement looking at the duplicates with Closed [Status] And [LastDateChange] is not null
- Create a temp table that would take in the records from the above queries before adding to the final table
That’s the logic I was thinking of doing, but so far stuck on building it (feel like it’s too windy). The final result that I’m looking for would be the following output –
EMPID | ActNumber | Status | ReqDate | LastDateChange |
---|---|---|---|---|
123 | 210390 | Open | 01/01/2020 | |
432 | 832102 | Open | 06/01/2020 | |
313 | 921235 | Closed | 03/03/2020 | 05/01/2020 |
610 | 182349 | Closed | 11/01/2018 |
Any help would be wonderful and greatly appreciated, thank you!
Advertisement
Answer
UNION and NOT IN returns desired output for given sample data.
SELECT EmpID, ActNumber, Status, ReqDate, LastDateChange FROM tblTest WHERE Status = "Open" UNION SELECT EmpID, ActNumber, Status, ReqDate, LastDateChange FROM tblTest WHERE NOT LastDateChange Is Null AND EmpID NOT IN (SELECT EmpID FROM tblTest WHERE Status="Open") UNION SELECT EmpID, ActNumber, Status, ReqDate, LastDateChange FROM tblTest WHERE LastDateChange Is Null AND EmpID NOT IN (SELECT EmpID FROM tblTest WHERE Status="Open") AND EmpID NOT IN (SELECT EmpID FROM tblTest WHERE NOT LastDateChange Is Null AND EmpID NOT IN (SELECT EmpID FROM tblTest WHERE Status="Open")) ;
Updated – KNog This is a revised of the above suggestion and I got the correct output.
SELECT tblTest.EmpID, ActNumber, Status, ReqDate, LastDateChange FROM tblTest INNER JOIN ( SELECT EmpID, Max(CDate(ReqDate)) As MaxDate From tblTest WHERE Not EmpID Is Null AND Status = 'Open' GROUP BY EmpID) As MaxOpnAct ON tblTest.EmpID = MaxOpnAct.EmpID WHERE Status = "Open" UNION SELECT tblTest.EmpID, ActNumber, Status, ReqDate, LastDateChange FROM tblTest INNER JOIN ( SELECT EmpID, Max(CDate(ReqDate)) As MaxDate From tblTest WHERE Not EmpID Is Null AND Status = 'Closed' GROUP BY EmpID HAVING Count(EmpID)=1) As MaxClsNonDup ON tblTest.EmpID = MaxClsNonDup.EmpID UNION SELECT tblTest.EmpID, ActNumber, Status, ReqDate, LastDateChange FROM tblTest INNER JOIN ( SELECT EmpID, Max(CDate(ReqDate)) As MaxDate From tblTest WHERE Not EmpID Is Null AND Status = 'Closed' GROUP BY EmpID HAVING Count(EmpID)>1) As MaxClsDup ON tblTest.EmpID = MaxClsDup.EmpID WHERE NOT LastDateChange Is Null AND Status = 'Closed' AND CDate(ReqDate) = MaxDate