2016-02-27 2 views
2

Я имею структуру таблицы, как этототеля поколение комнаты Статуса в SQL

id    int 
checkinttime datetime 
checkouttime datetime 
roomid   int 

Я записал CheckIN и время оформления заказа в этой таблице. Мой вопрос заключается в том, как сгенерировать отчет по дате, который генерирует занятость комнаты или нет в этом диапазоне дат, подобном этому.

room 3/1/2016 3/2/2016 3/3/2016 6/4/2016 
r1  P   V  V  P 
r2  v   p  p  p 

где p означает занятый, а V означает свободный. Как написать SQL для этого.?

Заранее спасибо.

This is the structure. customer select start date and end date. With that parameters, room and date wise details are needed.

+0

у вас есть еще один стол для помещений , не так ли? – wajeeh

+0

да, есть столик. roomid является иностранным ключом. – siyadkk

+0

Я думаю, вместо того, чтобы сделать диапазон дат динамическим, используйте идентификатор комнаты как столбцы и дату в виде строк. – Utsav

ответ

1

Решение состоит в том, чтобы использовать статический запрос через номер в виде столбцов, как это:

;WITH dates(date) AS (
    SELECT @startDate 
    UNION ALL 
    SELECT DATEADD(DAY, 1, date) 
    FROM dates 
    WHERE date < @endDate 
), occupied AS (
SELECT date, c.booking_id 
FROM dates d 
    LEFT JOIN -- You can use `JOIN` only also to remove free dates 
    CheckStatus c ON d.date BETWEEN c.checkin_time AND c.checkout_time 
) 
SELECT date 
    , MIN(CASE WHEN id = 1 THEN 'P' ELSE 'V' END) AS 'r1' 
    , MIN(CASE WHEN id = 2 THEN 'P' ELSE 'V' END) AS 'r2' 
FROM occupied 
GROUP BY date; 

Результат будет выглядеть следующим образом:

date  | r1 | r2 | 
-----------+----+----+ 
2016-03-01 | P | V | 
2016-03-02 | V | P | 
2016-03-03 | V | P | 
2016-03-04 | V | P | 
+0

, пожалуйста, напишите полный запрос с параметрами startdate и enddate – siyadkk

+0

с такими параметрами может быть проще;). –

+0

благодарит Ша за вашу поддержку. Я загрузил изображение. Пожалуйста, проверь это. – siyadkk

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