首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从明细表创建“摘要”列

从明细表创建“摘要”列
EN

Stack Overflow用户
提问于 2012-01-17 15:40:27
回答 3查看 200关注 0票数 0

我有一个有几个stores的应用程序,每个商店在store_hours中都有几个记录。

store_hours表如下所示:

代码语言:javascript
运行
复制
store_id [int]
day [varchar(20)]
opening_time [varchar(20)]
closing_time [varchar(20)]

一家商店的记录可能是这样的:

代码语言:javascript
运行
复制
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”

我通过运行类似于以下内容的查询来填充它:

代码语言:javascript
运行
复制
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表中根本就没有记录。我还没有想出一个好办法来处理这件事。Suggestions?

编辑

有几个人建议使用枢轴表。我知道如何在这里获得开场或闭幕式的时间,但我看不出如何做到这两件事,我也不知道如何将其归纳为一个查询。

到目前为止,这就是我所拥有的:

代码语言:javascript
运行
复制
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与第二个表的结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-18 14:02:53

也许这个能帮到你。没有更新或插入。和你原来的帖子一样的表格

代码语言:javascript
运行
复制
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;
票数 2
EN

Stack Overflow用户

发布于 2012-01-17 15:46:38

实际上,我会将数据转到轴上,并使列标题显示随时间变化的日子。参见枢轴帮助http://msdn.microsoft.com/en-us/library/ms177410.aspx

票数 1
EN

Stack Overflow用户

发布于 2012-01-17 15:48:41

在不了解更多信息的情况下,很难判断store_hours模式在此场景中是否正确。您可以对开放时间的模式进行稍微不同的设计--通常认为每天有一行是正确的--这是一种默认的设计模式。

这是那些固定的场景之一,您可以选择将模式中的列转换为支点,以使生活更容易一些。(不过,除了其他用途之外,这可能会让事情变得更困难,所以这里有一个关于取决于你的用法的警告。)

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8897425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档