2015-03-05 2 views
-1

Я ищу, чтобы получить один результат, показывающий общее количество студентов, активно участвующих в каждом году в определенном пользователем диапазоне.Общее количество студентов, активно участвующих в диапазоне дат

для например DB Структура

StudentId  Course  StartDate EndDate 
    1  BSc Maths  2012-01-01 2015-01-01 
    2  BSc English 2014-01-01 2017-01-01 

Если пользователь определяет активно прорабатывает между «2013» и «2016» на выходе я хотел бы получить это;

YEAR Student_Count 
2013  1 
2014  2 
2015  2 
2016  1 

Спасибо за ваше время :)

ответ

0

Вы должны иметь таблицу лет, чтобы сделать это.

Здесь я создаю летние таблицы через Recursive CTE. Вы можете создать таблицу physical лет и использовать ее вместо рекурсивного CTE.

DECLARE @max_yr INT = (SELECT Max(Year(EndDate)) yr FROM yourtable); 

WITH cte 
    AS (SELECT Min(Year(StartDate)) yr 
     FROM yourtable 
     UNION ALL 
     SELECT yr + 1 
     FROM cte 
     WHERE yr < @max_yr) 
SELECT a.yr as [YEAR], 
     Count(1) as [Student_Count] 
FROM cte a 
     JOIN yourtable b 
     ON a.yr BETWEEN Year(b.StartDate) AND Year(b.EndDate) 
      AND a.yr BETWEEN 2013 AND 2016 
GROUP BY a.yr 
0

Вы могли бы попробовать это, конечно, работал для меня - очевидно @startYear и @endYear будут заменены собственными переменными, но я оставил их в так что вы понимаете, как код работает:

Create Table #Temp2 ([YEAR] int, Student_Count int) 

Declare @startYear int = '2013', 
     @endYear int = '2016' 

while (@startYear <= @endYear) 
Begin 
    Insert into #Temp2 
    Select @startYear [YEAR], count(studentId) 
    from table 
    where Cast(Cast(@startYear as varchar) as date) between StartDate and EndDate 
    Set @startYear = @startYear + 1 
End 

Select * from #Temp2 
Смежные вопросы