Запрос SQL-Server, вычисляющий скорость оплаты в месяц

Я работаю над заявлением на бронирование, и я создаю запрос, который рассчитывает уровень активности в отеле по месяцам. Для этого я должен проверить даты регистрации и проверки всех заказов и увеличить некоторые переменные и связать их с соответствующими месяцами. Мне нужно только измерять эти ставки в текущем году. Если в заказе указана дата выписки или дата регистрации, в которой месяц составляет март (например), мне нужно увеличить эту переменную, соответствующую окупированию в этом месяце. И мне нужно сделать это для каждого бронирования в этом году.

В бронировании указана дата проверки и дата выписки, другие атрибуты не относятся к этому запросу, входными параметрами являются BeginDate (2015-01-01) и EndDate (2015-12-31).

Month Ocupation [JANUARY] | 29 [FEBRUARY] | 20 [MARCH] | 30 ....... | ... 

Это то, что я сделал до сих пор, в какой-то момент я потерялся. Любая помощь будет оценена по достоинству.

  Select SUM(CASE WHEN datename(month, [CheckIn]) = 'January' or datename(month, [CheckOut]) = 'January' THEN 1 ELSE 0 END) January, SUM(CASE WHEN datename(month, [CheckIn]) = 'February' or datename(month, [CheckOut]) = 'February' THEN 1 ELSE 0 END) February, SUM(CASE WHEN datename(month, [CheckIn]) = 'March' or datename(month, [CheckOut]) = 'March' THEN 1 ELSE 0 END) March, SUM(CASE WHEN datename(month, [CheckIn]) = 'April' or datename(month, [CheckOut]) = 'April' THEN 1 ELSE 0 END) April, SUM(CASE WHEN datename(month, [CheckIn]) = 'May' or datename(month, [CheckOut]) = 'May' THEN 1 ELSE 0 END) May, SUM(CASE WHEN datename(month, [CheckIn]) = 'June' or datename(month, [CheckOut]) = 'June' THEN 1 ELSE 0 END) June, SUM(CASE WHEN datename(month, [CheckIn]) = 'July' or datename(month, [CheckOut]) = 'July' THEN 1 ELSE 0 END) July, SUM(CASE WHEN datename(month, [CheckIn]) = 'August' or datename(month, [CheckOut]) = 'August' THEN 1 ELSE 0 END) August, SUM(CASE WHEN datename(month, [CheckIn]) = 'September' or datename(month, [CheckOut]) = 'September' THEN 1 ELSE 0 END) September, SUM(CASE WHEN datename(month, [CheckIn]) = 'October' or datename(month, [CheckOut]) = 'October' THEN 1 ELSE 0 END) October, SUM(CASE WHEN datename(month, [CheckIn]) = 'November' or datename(month, [CheckOut]) = 'November' THEN 1 ELSE 0 END) November, SUM(CASE WHEN datename(month, [CheckIn]) = 'December' or datename(month, [CheckOut]) = 'December' THEN 1 ELSE 0 END) December FROM {Booking} INNER JOIN {Status} ON {Booking}.[StatusId] = {Status}.[Id] WHERE {Booking}.[CheckIn] >= @BeginDate AND {Booking}.[CheckOut] <= @EndDate AND {Status}.[Label] <> 'Canceled' 

Предполагая, что вы хотите подсчитать заказы, где CheckIn и CheckOut происходят в том же месяце, что и 1 занятие за этот месяц, а также заказы, которые имеют CheckIn и CheckOut в разные месяцы как 1 для каждого месяца, тогда этот запрос должен работать:

 SELECT Month, 'Occupation' = COUNT(MonthNo) FROM Booking OUTER APPLY ( SELECT MonthNo, Month FROM ( VALUES (1, 'January'), (2, 'February'), (3, 'March'),(4, 'April'), (5, 'May') ) AS Months (MonthNo, Month) WHERE MonthNo BETWEEN MONTH(CheckIn) AND MONTH(CheckOut) ) c -- WHERE CheckIn >= @BeginDate -- AND CheckOut <= @EndDate -- AND [Status].[Label] <> 'Canceled' GROUP BY Month, MonthNo ORDER BY MonthNo 

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

Учитывая входную таблицу, такую ​​как:

 Id CheckIn CheckOut 1 2015-01-30 2015-03-31 -- 1 for Jan, Feb, Mar 2 2015-01-03 2015-01-05 -- 1 for Jan 3 2015-01-30 2015-02-05 -- 1 for Jan, Feb 4 2015-01-30 2015-01-31 -- 1 for Jan 5 2015-02-01 2015-02-03 -- 1 for Feb 6 2015-03-22 2015-04-01 -- 1 for Mar, Apr 7 2015-03-23 2015-04-03 -- 1 for Mar, Apr 8 2015-03-30 2015-03-31 -- 1 for Mar 9 2015-04-01 2015-04-03 -- 1 for Apr 10 2015-04-28 2015-05-01 -- 1 for Apr, May 11 2015-05-01 2015-05-03 -- 1 for May 

он выдавал бы такой результат, как:

 Month Occupation January 4 February 3 March 4 April 4 May 2 
Interesting Posts
Давайте будем гением компьютера.