Compter les périodes et la durée de maladie dans un roulement de 12 mois

Je suis assez nouveau à SQL et trouve ce site pour être une ressource shinye. J'espère avoir un peu d'aide pour une tâche qui m'a été confiée.

Fondamentalement, j'ai besoin de find le nombre de périodes de maladie qu'un membre du personnel a pris au cours des 12 derniers mois et la durée de chaque période de maladie.

J'ai une table simple qui ressemble à ceci:

Agent Date Status A 01/07/2015 SHIFT A 02/07/2015 SHIFT A 03/07/2015 SICK A 04/07/2015 SHIFT A 05/07/2015 SHIFT A 06/07/2015 SHIFT B 01/07/2015 SICK B 02/07/2015 SICK B 03/07/2015 SHIFT B 04/07/2015 SHIFT B 05/07/2015 SICK B 06/07/2015 SICK C 01/07/2015 SHIFT C 02/07/2015 SHIFT C 03/07/2015 SICK C 04/07/2015 SICK C 05/07/2015 SICK C 06/07/2015 SHIFT 

J'espère que quelqu'un peut m'aider à find du code qui produirait le type de sortie suivant:

 Agent Days A 1 B 2 B 2 C 3 

Toute aide serait grandement appréciée.

À votre santé

Pour sql-server:

 select count(1) from TableA where Status = 'SICK' and Date >= CAST(DATEADD(MONTH, -12, CURRENT_TIMESTAMP) AS DATE) group by Agent 

Groupé par périodes de maladie:

 WITH Cte AS( SELECT *, DATEDIFF(dd, '12/30/1899', [Date]) as [number], RN = DATEDIFF(dd, '12/30/1899', [Date]) - ROW_NUMBER() OVER(PARTITION BY Agent ORDER BY DATEDIFF(dd, '12/30/1899', [Date])) FROM TableA WHERE [Status] = 'SICK' and [Date] >= CAST(DATEADD(MONTH, -12, CURRENT_TIMESTAMP) AS DATE) ) ,CteFinal AS( SELECT Agent, startNumber = MIN(number), endNumber = MAX(number) FROM Cte GROUP BY Agent, RN ) select Agent, endNumber - startNumber +1 as [Days] from CteFinal group by agent, startNumber, endNumber 

Sqlfiddle

De plus, pour les cas avec jours de repos dans la table TableB:

 WITH Cte AS( SELECT distinct *, DATEDIFF(dd, '12/30/1899', [Date]) as [number], RN = DATEDIFF(dd, '12/30/1899', [Date]) - ROW_NUMBER() OVER(PARTITION BY Agent ORDER BY DATEDIFF(dd, '12/30/1899', [Date])) FROM (select distinct * from TableA union all select distinct Agent, b.Date, 'DAY OFF' from TableA cross join TableB b) TableA WHERE [Status] IN ('SICK', 'DAY OFF') and [Date] >= CAST(DATEADD(MONTH, -12, CURRENT_TIMESTAMP) AS DATE) ) ,CteFinal AS( SELECT Agent, startNumber = MIN(number), endNumber = MAX(number), dayOffs = SUM(CASE WHEN [Status] = 'DAY OFF' THEN 1 ELSE 0 END) FROM Cte GROUP BY Agent, RN ) select Agent, endNumber - startNumber +1 - sum(dayOffs) as [Days] from CteFinal group by agent, startNumber, endNumber having(endNumber - startNumber +1 - sum(dayOffs) > 0) 

Sqlfiddle