2015-11-20 2 views
1

Рассмотрим ниже данные:счетчик SQL, где между датами по месяцам

ID Reference Manager LeaseFirstStart   LeaseStop 
1 KLEIN  John 2008-04-02 00:00:00.000 2010-04-01 00:00:00.000 
2 HAWKER  John 2008-12-18 00:00:00.000 2010-09-17 00:00:00.000 
3 SLEEP  Bob  2008-01-23 00:00:00.000 2009-01-22 00:00:00.000 
4 CODD  Bob  2009-08-03 00:00:00.000 2010-08-02 00:00:00.000 
5 ALLEN  Bob  2008-01-30 00:00:00.000 2009-07-31 00:00:00.000 

Самый ранний месяц является Ян 2008 и последний месяц сентябрь 2010

Как можно подсчитать количество договоров аренды, которые были текущий месяц? Вывод должен выглядеть следующим образом:

Month  Number of Leases 
2008-01 2  
2008-02 2  
2008-03 2  
2008-04 3  
2008-05 3  
2008-06 3  
2008-07 3  
2008-08 4  
…   …  

В конце концов, я хочу, чтобы использовать ответ на вопрос, чтобы создать набор данные ниже для использования в первенствуешь пользователь, чтобы они могли видеть, кто имел сколько у аренды в течение периода данных ,

Month  Manager Number of Leases 
2008-01 Bob  2 
2008-01 John  0 
2008-02 Bob  2 
2008-02 John  0 
2008-03 Bob  2 
2008-03 John  0 
2008-04 Bob  2 
2008-04 John  1 
2008-05 Bob  2 
2008-05 John  1 
2008-06 Bob  2 
2008-06 John  1 
2008-07 Bob  2 
2008-07 John  1 
2008-08 Bob  3 
2008-08 John  1 
…   …   … 

Я знаю, что делал это раньше, но это было давно, и я помню, что это грязный. Заранее спасибо!

+0

GROUP BY и SUM возможно? –

+0

Вы хотите, чтобы список комбинаций год-месяц с данными других столбцов? – Ajay2707

ответ

0

Это очень логичный вопрос, в конце концов я создал SQL, который дает желаемого результата .. Я проверил каждую дату и месяц подсчета и его все в порядке.

Declare @t table (ID int, Reference varchar(50), Manager varchar(50),LeaseFirstStart datetime,LeaseStop datetime) 
insert into @t 
values 
(1,'KLEIN','John','2008-04-02 00:00:00.000','2010-04-01 00:00:00.000'), 
(2,'HAWKER','John','2008-12-18 00:00:00.000','2010-09-17 00:00:00.000'), 
(3,'SLEEP','Bob','2008-01-23 00:00:00.000','2009-01-22 00:00:00.000'), 
(4,'CODD','Bob','2009-08-03 00:00:00.000','2010-08-02 00:00:00.000'), 
(5,'ALLEN','Bob','2008-02-28 00:00:00.000','2009-07-31 00:00:00.000') 


declare @lowerdate datetime , @currentdt datetime 
select @lowerdate = min(leasefirststart), @currentdt= max(leasestop) from @t 

;with cte as 
( 
    select firstday,DATEADD(d, -1, DATEADD(m, DATEDIFF(m, 0, FirstDay) + 1, 0)) Lastday, mng from 
    (select dateadd(m,datediff(m,0,@lowerdate)+v.number,0) as FirstDay  
     From master..spt_values v 
     Where v.type='P' and v.number between 0 and datediff(m, @lowerdate, @currentdt) 
    ) as a 
    , (select distinct manager mng from @t) as b 
) 

select (convert(varchar,datepart (yyyy,FirstDay)) + '-' + convert(varchar, MONTH(FirstDay))) MonthAndYear ,mng as mng , count(manager) cnt 
from cte 
left join @t on 
( 
    firstday between LeaseFirstStart and LeaseStop 
    or 
    Lastday between LeaseFirstStart and LeaseStop 
) and cte.mng = Manager 
group by firstday, mng 
order by FirstDay 
+0

Это красиво. Спасибо, и я надеюсь, что другие получат от этого выгоду. – Warren

1
select sum (no) as no,datet from (SELECT COUNT (*) as no ,(convert(varchar,datepart (yyyy,[ Start])) + '-' + convert(varchar, MONTH([ Start]))) as datet 
FROM <tbl> 
GROUP BY (convert(varchar,datepart (yyyy,[ Start])) + '-' + convert(varchar, MONTH([ Start]))) 
union SELECT COUNT (*) as no ,(convert(varchar,datepart (yyyy,[ End])) + '-' + convert(varchar, MONTH([ End]))) as datet 
FROM <tbl> 
GROUP BY (convert(varchar,datepart (yyyy,[ End])) + '-' + convert(varchar, MONTH([ End])))) t 
+0

не дают 2 ответа на тот же вопрос, используйте вариант редактирования, а не новый ответ. – Ajay2707

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