Создание столбца «Сводка» из таблицы сведений - PullRequest
0 голосов
/ 17 января 2012

У меня есть приложение, в котором есть несколько 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

Теперь это будет работать (более или менее), но у меня естьпара вопросов.

  1. Это, на мой взгляд, некрасиво и, похоже, много повторений.Можно ли как-нибудь улучшить его?
  2. Для некоторых записей, если хранилище закрыто, в таблице 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

ВНОВЬ РЕДАКТИРОВАТЬ

Для тех из вас, кто из будущего задается вопросом, получилось ли у меня это как-нибудь,В итоге я создал две отдельные сводные таблицы, затем вставил результаты первой таблицы и обновил результаты второй.

Ответы [ 3 ]

2 голосов
/ 18 января 2012

Может быть, это поможет вам. Нет обновления или вставки. Та же таблица, что и у оригинального поста

DECLARE @store_hours TABLE
(
    store_id int,
    [day] varchar(20),
    opening_time varchar(20),
    closing_time varchar(20)
)

INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Monday', '7am', '8:30pm')
INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Tuesday', '7am', '8:30pm')
INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Wednesday', '7am', '8:30pm')
INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Thursday', '7am', '8:30pm')
INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Friday', '7am', '10pm')
INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Saturday', 'closed', 'closed')
INSERT INTO @store_hours(store_id,[day],opening_time,closing_time)VALUES(301, 'Sunday', 'closed' ,'closed')

SELECT
    *
FROM
(
    SELECT 
        [day], 
        opening_time+'-'+closing_time AS Times
    FROM @store_hours AS store_hours
) AS SourceTable
PIVOT
    (
        MAX(Times)
        FOR [day] IN ([Monday], [Tuesday], [Wednesday], [Thursday], [Friday], [Saturday],[Sunday])
    )AS PivotTable;
1 голос
/ 17 января 2012

Трудно судить, правильна ли схема store_hours в этом сценарии, не зная больше. Вы могли бы спроектировать схему для часов работы немного по-другому - обычно думали, что вы будете правы, если бы у вас была строка в день - это своего рода шаблон проектирования по умолчанию.

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

store_id [int] 
week_begin_dt [datetime]
mon_opening_time [varchar(20)] 
mon_closing_time [varchar(20)] 
tue_opening_time [varchar(20)] 
tue_closing_time [varchar(20)] 
...
sun_opening_time [varchar(20)] 
sun_closing_time [varchar(20)] 

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

1 голос
/ 17 января 2012

Я бы на самом деле повернул данные и заставил бы заголовки столбцов отображать дни со временем. См. Сводную справку http://msdn.microsoft.com/en-us/library/ms177410.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...