В настоящее время у меня есть таблица базы данных, в которой записываются заказы на вакансии, и доступно 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, который я должен использовать, или я полностью ошибаюсь?
Любая помощь будет оценена. Спасибо!
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 выбранной даты
Если вы ищете динамические решения, вам необходимо использовать сводную таблицу.
Выберите * из (выберите * из своей таблицы) как Temptable Pivot (Count (room) For timelot In (list of timeslot)) As tempSlot
Для получения дополнительной информации проверьте эту ссылку сводная таблица MySQL
Похожие вопросы
Новые вопросы
php
PHP - это широко используемый высокоуровневый, динамический, объектно-ориентированный и интерпретируемый язык сценариев, в первую очередь предназначенный для серверной веб-разработки. Используется для вопросов о языке PHP.