2014-09-23 4 views
0

У меня есть эти данные: tb_Leaveподсчет общего числа транзакций с в диапазоне дат

id | empID | startDate | endDate 
1 |  1  | 01/02/2014 | 01/05/2014  ------ 2, 3, 4, 5 
2 |  2  | 01/03/2014 | 01/03/2014  ------ 3 
3 |  3  | 01/04/2014 | 01/07/2014  ------ 4, 5, 6, 7 
4 |  4  | 01/03/2014 | 01/07/2014  ------ 3, 4, 5, 6, 7 
5 |  5  | 01/09/2014 | 01/09/2014  ------ 9 

Я хочу, чтобы вернуть все общее простился с через определенные дни. из положить:

total | Date 
    1  | 01/02/2014 
    3  | 01/03/2014 
    3  | 01/04/2014 
    3  | 01/05/2014 
    2  | 01/06/2014 
    2  | 01/07/2014 
    1  | 01/09/2014 
+0

Нужно ли быть одним запросом? –

+0

любой запрос. – user2530833

ответ

1

Вы можете расширить даты, используя рекурсивный КТР, а затем использовать group by:

with cte as (
     select startdate as thedate, enddate 
     from tb_leave 
     union all 
     select dateadd(day, 1, startdate), enddate 
     from cte 
     where startdate < enddate 
) 
select thedate, count(*) 
from cte 
group by thedate 
with (MAXRECURSION 0); 

Примечания: это предполагает, что не более чем 99 дней для одной строки. В противном случае добавьте опцию MAXRECURSION. Вы также можете сделать это, соединяясь в таблицу чисел, например spt_values:

select dateadd(day, v.number - 1, startdate) as thedate, count(*) 
from tb_leave l join 
    spt_values v 
    on dateadd(day, v.number - 1, startdate) <= l.enddate 
group by dateadd(day, v.number - 1, startdate) 
order by 1; 
+0

по первому запросу, у меня есть это Заявление прекращено. Максимальная рекурсия 100 была исчерпана до завершения заявки. – user2530833

Смежные вопросы