Edit: because there was an error in my solution. Missed changing one of the GETDATE() to @CurrentDate for testing purposesThis is a continuation of this topic. The original topic looked at service records divided up by fiscal year* for a given client and determined if they fell into one of two required types (all or minimal) depending on the type of services. Please read the op in that topic for a complete description of the original problem.*Our fiscal year runs from Oct 1st thru Sept 30th. So 2012/10/01 thru 2013/09/30 is in fiscal year 2013.SwePeso came back with a perfect solution that ran about 60 times faster than mine. But now a wrinkle has been added to the way fiscal year is calculated.The change I need to make is that we want to look at least 90 days of services to determine required status for a given Fiscal Year. When we switch to fiscal year 2014 on 2013-10-01 the current code will only look at services from October on (of which there will most likely be none).So (for example) if the current date was 2013-10-20 I would count any services that happened between 2013-07-22 and 2013-09-30 (inclusive) both toward fiscal year 2013 and fiscal year 2014 in determining required status.I have come up with a solution (see below) that I am currently testing but I would appreciate some constructive feedback or suggestions of a better way to do it.My current solution (see end of post for test data and expected results depending on the value of @CurrentDate): drop table TestResultsFiscalYeardeclare @CurrentDate dateSelect @CurrentDate = '2013/10/21' select @CurrentDate,DATEADD(dd,-90,@CurrentDate);WITH cteSource(ClientID, DateOfService, SpecialProcedures, FiscalYear)AS ( SELECT ScClientID, DateOfService, CASE WHEN ScProcedureCode LIKE 'H0002%' THEN 1 WHEN ScProcedureCode LIKE 'H0025%' THEN 1 WHEN ScProcedureCode LIKE 'H0031%' THEN 1 WHEN ScProcedureCode LIKE 'T1023%' THEN 1 WHEN ScProcedureCode LIKE 'T2011%' THEN 1 WHEN ScProcedureCode LIKE '%HF%' THEN 1 ELSE 0 END AS SpecialProcedures, DATEPART(YEAR, DATEADD(MONTH, 3, DateOfService)) AS FiscalYear FROM TestDataFiscalYear union select ScClientid , DateOfService , CASE WHEN ScProcedureCode LIKE 'H0002%' THEN 1 WHEN ScProcedureCode LIKE 'H0025%' THEN 1 WHEN ScProcedureCode LIKE 'H0031%' THEN 1 WHEN ScProcedureCode LIKE 'T1023%' THEN 1 WHEN ScProcedureCode LIKE 'T2011%' THEN 1 WHEN ScProcedureCode LIKE '%HF%' THEN 1 ELSE 0 END AS SpecialProcedures --, DATEPART(Year,GETDATE()) + 1 as FiscalYear though this will be correct when in production , DATEPART(Year,@CurrentDate) + 1 AS FiscalYear FROM TestDataFiscalYear where datepart(month,@CurrentDate) in (10,11,12) and DateOfService >= DATEADD(dd,-90,@CurrentDate))SELECT ClientID, FiscalYear, CASE WHEN SUM(SpecialProcedures) = COUNT(*) THEN 'Minimal' ELSE 'All' END AS RequiredType, MAX(DateOfService) AS LastDateOfServiceinto TestResultsFiscalYearFROM cteSourceGROUP BY ClientID, FiscalYear; select @CurrentDate as CurrentDate,* from TestResultsFiscalYear order by ClientID, FiscalYear
Test table with test data and expected results (plug CurrentDate from result into @CurrentDate above to get results show.Create Table TestDataFiscalYear (ScProcedureCode varchar(10), ScClientId int, DateOfService datetime)Data Set 1:delete from TestDataFiscalYearinsert TestDataFiscalYearselect 'T1023QJ', 65006, '2013-06-10 00:00:00.000' union allselect 'H0031', 65006, '2013-06-12 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-06-30 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-07-07 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-07-29 00:00:00.000' union allselect '90801AF', 65006, '2013-08-01 00:00:00.000' union allselect 'H0002QJ', 65006, '2013-08-04 00:00:00.000' union allselect 'H0031', 65006, '2013-08-05 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-08-14 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-09-15 00:00:00.000' union allselect 'H0031', 65006, '2013-09-21 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-10-07 00:00:00.000' union allselect 'H0031', 65006, '2013-10-24 00:00:00.000'Results:CurrentDate ClientID FiscalYear RequiredType LastDateOfService----------- ----------- ----------- ------------ -----------------------2013-10-20 65006 2013 All 2013-09-21 00:00:00.0002013-10-20 65006 2014 All 2013-10-24 00:00:00.000CurrentDate ClientID FiscalYear RequiredType LastDateOfService----------- ----------- ----------- ------------ -----------------------2013-10-31 65006 2013 All 2013-09-21 00:00:00.0002013-10-31 65006 2014 Minimal 2013-10-24 00:00:00.000Data Set 2delete from TestDataFiscalYearinsert TestDataFiscalYearselect 'T1023QJ', 65006, '2013-06-10 00:00:00.000' union allselect 'H0031', 65006, '2013-06-12 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-06-30 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-07-07 00:00:00.000' union allselect 'T1023QJ', 65006, '2013-07-22 00:00:00.000'Results:CurrentDate ClientID FiscalYear RequiredType LastDateOfService----------- ----------- ----------- ------------ -----------------------2013-10-20 65006 2013 Minimal 2013-07-22 00:00:00.0002013-10-20 65006 2014 Minimal 2013-07-22 00:00:00.000
The last service happened just within the 90 day window so we still want to have a record for this client/2014 fiscal yearCurrentDate ClientID FiscalYear RequiredType LastDateOfService----------- ----------- ----------- ------------ -----------------------2013-10-21 65006 2013 Minimal 2013-07-22 00:00:00.000
The last service has now happened more than 90 days ago in a different fiscal year therefore we do not even want a record for this client/2014 fiscal year.