У меня есть приложение, в котором есть несколько stores
, и в каждом магазине есть несколько записей в store_hours
.
Таблица store_hours
выглядит следующим образом:
store_id [int]
day [varchar(20)]
opening_time [varchar(20)]
closing_time [varchar(20)]
изаписи для одного магазина могут выглядеть следующим образом:
301, 'Monday', '7am', '8:30pm'
301, 'Tuesday', '7am', '8:30pm'
301, 'Wednesday', '7am', '8:30pm'
301, 'Thursday', '7am', '8:30pm'
301, 'Friday', '7am', '10pm'
301, 'Saturday', 'closed,' 'closed'
301, 'Sunday', 'closed,' 'closed'
Мы пытаемся создать столбец «Сводка часов» в таблице магазинов.Приведенный выше запрос приведет к чему-то вроде: «M: 7 утра-8:30 вечера, T: 7 утра-8:30 вечера, W: 7 утра-8:30 вечера, T: 7 утра-8:30 вечера, F: 7 утра-8:30 вечера, S: закрыто, S: закрыто '
Я заполняю его, выполняя запрос, подобный следующему:
UPDATE s
SET hours_summary =
'M: ' + (SELECT TOP 1 ch.opening_time FROM store_hours ch WHERE c.id = ch.store AND [day] = 'Monday') + '-' + (SELECT TOP 1 ch.closing_time FROM store_hours ch WHERE c.id = ch.store AND [day] = 'Monday') + ', ' +
'T: ' + (SELECT TOP 1 ch.opening_time FROM store_hours ch WHERE c.id = ch.store AND [day] = 'Tuesday') + '-' + (SELECT TOP 1 ch.closing_time FROM store_hours ch WHERE c.id = ch.store AND [day] = 'Tuesday') + ', '
(etc, for the other five days)
FROM stores s
Теперь это будет работать (более или менее), но у меня естьпара вопросов.
- Это, на мой взгляд, некрасиво и, похоже, много повторений.Можно ли как-нибудь улучшить его?
- Для некоторых записей, если хранилище закрыто, в таблице store_hours нет записей вообще.Я не нашел хороший способ справиться с этим.Предложения?
РЕДАКТИРОВАТЬ
Несколько человек рекомендовали использовать сводную таблицу.Я вижу, как я могу получить время открытия или , но я не вижу, как я могу сделать оба, и я не вижу, как я могу обобщить его в один запрос.
Это то, что у меня есть до сих пор:
SELECT centre, [Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday]
FROM (SELECT centre, [day], opening_time FROM centre_hours) AS p
PIVOT (MAX(opening_time) FOR [day] IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday], [Sunday])) AS pt
ВНОВЬ РЕДАКТИРОВАТЬ
Для тех из вас, кто из будущего задается вопросом, получилось ли у меня это как-нибудь,В итоге я создал две отдельные сводные таблицы, затем вставил результаты первой таблицы и обновил результаты второй.