В настоящее время у меня есть таблица базы данных, в которой записываются заказы на вакансии, и доступно 8 временных интервалов.

+-----------+
|tbl_booking|
+-----------+
|room_id    |
|date       |
|timeslot   |
|booking    |
+-----------+


sample data
+-----------+----------+-----------+
|room_id    | date     | timeslot  |
+-----------+----------+-----------+
|1          |2018-01-01|  1        |
|1          |2018-01-01|  2        |
|1          |2018-01-01|  4        |
|2          |2018-01-01|  1        |
+-----------+----------+-----------+

intended outcome - when statement filters for bookings on 2018-01-01
+-----------+----------+-----------+----------+-----------+
|room       |timeslot1 | timeslot2 |timeslot3 | timeslot4 |
+-----------+----------+-----------+----------+-----------+
|1          |    X     |     X     |          |    X      |
|2          |    X     |           |          |           |
+-----------+----------+-----------+----------+-----------+

Я начал с этого утверждения:

SELECT * from tbl_booking WHERE date = '2018-01-01' GROUP BY room_id

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

Должен ли быть оператор SQL, который я должен использовать, или я полностью ошибаюсь?

Любая помощь будет оценена. Спасибо!

0
user3448267 1 Янв 2018 в 22:07

2 ответа

Лучший ответ

То, что вы хотите делать с данными, нехорошо, и если у вас есть фиксированное количество временных интервалов, вы можете жестко закодировать столбцы следующим образом:

SELECT room_id,
       SUM(CASE WHEN timeslot = 1 then 1 else 0 END) AS Timeslot1,
       SUM(CASE WHEN timeslot = 2 then 1 else 0 END) AS Timeslot2,
       SUM(CASE WHEN timeslot = 3 then 1 else 0 END) AS Timeslot3,
       SUM(CASE WHEN timeslot = 4 then 1 else 0 END) AS Timeslot4
 FROM tbl_booking
 GROUP BY room_id

(см. SQL Fiddle)

Вы можете использовать MAX, если просто хотите узнать, существует ли хотя бы одно бронирование

SQL для включения примечания, вы можете обмануть его, чтобы выбрать примечание через группу с помощью MAX

SELECT room_id,
       SUM(CASE WHEN timeslot = 1 then 1 else 0 END) AS Timeslot1,
       MAX(CASE WHEN timeslot = 1 THEN remark ELSE '' END) AS Timeslot1Remark,
       SUM(CASE WHEN timeslot = 2 then 1 else 0 END) AS Timeslot2,
       MAX(CASE WHEN timeslot = 2 THEN remark ELSE '' END) AS Timeslot2Remark,
       SUM(CASE WHEN timeslot = 3 then 1 else 0 END) AS Timeslot3,
       MAX(CASE WHEN timeslot = 3 THEN remark ELSE '' END) AS Timeslot3Remark,
       SUM(CASE WHEN timeslot = 4 then 1 else 0 END) AS Timeslot4,
       MAX(CASE WHEN timeslot = 4 THEN remark ELSE '' END) AS Timeslot4Remark
 FROM tbl_booking
 GROUP BY room_id

Ваш расширенный SQL Fiddle. Это не сработает для нескольких дат, только для 1 выбранной даты

1
Matt 1 Янв 2018 в 20:43

Если вы ищете динамические решения, вам необходимо использовать сводную таблицу.

Выберите * из (выберите * из своей таблицы) как Temptable Pivot (Count (room) For timelot In (list of timeslot)) As tempSlot

Для получения дополнительной информации проверьте эту ссылку сводная таблица MySQL

-1
Savaliya Bhavesh 1 Янв 2018 в 19:50