Cel mai simplu ar fi dacă îţi construieşti o tabelă "Calendar" cu toate zilele din perioada admisibilă. Vezi:
http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html
Poţi să generezi tabela Calendar pe baza unei tabele cu numere, generată "on-the-fly" cu una din metodele descrise în:
http://www.projectdmx.com/tsql/tblnumbers.aspx
(eu prefer metoda cu CTE-uri a lui Itzik Ben-Gan: e foarte rapidă şi nu necesită crearea altor obiecte în baza de date).
După aceea, poţi să faci un:
SELECT MIN(Data), MAX(Data),
SUM(CASE WHEN DATEPART(dw...)
FROM Calendar INNER JOIN Concedii ON Data BETWEEN DataInceput AND DataSfarsit
GROUP BY Persoana, DATEPART(wk...)
Dacă nu vrei să stochezi tabela Calendar, poţi să o construieşti on-the-fly cu un table-valued UDF, la fel ca şi tabela de numere.
La DATEPART ar trebui să iei în considerare şi @@DATEFIRST, pentru ca rezultatul să nu fie influenţat de SET DATEFIRST.
(dacă ai nevoie de indicii mai precise, spune-ne...)
Răzvan