我有一个有几个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:00-8:30,T: 7-8:30,W: 7-8:30,T: 7:7-8:30,F: 7:7-8:30,S: closed,S: closed”
我通过运行类似于以下内容的查询来填充它:
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
现在,这将起作用(或多或少),但我有几个问题。
,
编辑
有几个人建议使用枢轴表。我知道如何在这里获得开场或闭幕式的时间,但我看不出如何做到这两件事,我也不知道如何将其归纳为一个查询。
到目前为止,这就是我所拥有的:
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
再编辑
对于那些想知道我是否/如何解决这个问题的人来说,我最终创建了两个独立的枢轴表,然后INSERTing第一个表的结果,以及UPDATEing与第二个表的结果。
发布于 2012-01-18 14:02:53
也许这个能帮到你。没有更新或插入。和你原来的帖子一样的表格
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;
发布于 2012-01-17 15:46:38
实际上,我会将数据转到轴上,并使列标题显示随时间变化的日子。参见枢轴帮助http://msdn.microsoft.com/en-us/library/ms177410.aspx
发布于 2012-01-17 15:48:41
在不了解更多信息的情况下,很难判断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)]
无论解决方案如何,我也会为存储时间包括一个有效的开始日期,因为随着时间的推移,它们将发生变化,因此您可能希望能够对数据进行时间划分。这将让你记帐未来的商店时间,而不仅仅是当前的时间为本周。(假期和高峰时段将改变商店的正常营业时间。)
https://stackoverflow.com/questions/8897425
复制相似问题