我们将我们的网球场的预订信息从我们的SQL数据库提取到简单的结果表中,以帮助我们构建法庭使用情况图。除非预订时间超过一小时,否则它非常简单。基于值的单个或多个INSERT选择
目前,每个预订结果在我们的结果表中连续排列。每行包含开始时间,持续时间和法庭号码。我们希望将此表格直接映射到电子表格或数据透视表中,以便我们可以看到我们的法院预订了多少个小时以及一天中的哪个小时。
目前,我们的SQL查询看起来是这样的:
INSERT INTO Results (year, month, day, hour, duration, court)
SELECT DATEPART (yy, b.StartDateTime),
DATEPART (mm, b.StartDateTime),
DATEPART (dd, b.StartDateTime),
DATEPART (hh, b.StartDateTime),
a.Duration,
a.Court
FROM Bookings b
INNER JOIN Activities a
ON b.ActivityID = a.ID
我们的问题是,2,3小时或以上时间预订只能在结果表中的一行,即。预订的第一个小时。这是因为预订的时间长度会在持续时间数据中被捕获。我们可以对数据进行一些后处理来实现我们的目标,但如果在我们的SQL查询中可能会更容易一些。
该查询是否可以以某种方式进行修改,以便根据持续时间(可以是1,2,3 ......小时)将相应的行数插入到结果表中,每个持续时间为1 。因此,从上午9点开始的3小时预约将在结果表中产生三行,一个在上午9点,一个在上午10点,另一个在上午11点,每个持续时间为1小时。
因此,而不是在结果表中的一行:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 3, 1
我们得到如下行:
Year, Month, Day, Hour, Duration, Court
2009, 08, 25, 09, 1, 1
2009, 08, 25, 10, 1, 1
2009, 08, 25, 11, 1, 1
这会使结果表映射到电子表格中要容易得多。
UPDATE 2009-08-25:当然,正如第一对答案所示,它不一定是单个查询。一套很好。
更新2009-08-26:已被侧面追踪,还没有机会尝试提出的解决方案。希望尽快这样做,并根据结果选择答案。
UPDATE 2009-08-27:终于有机会尝试解决方案。整体表格和加入以生成解决方案让人大开眼界。特别是使用交叉连接来创建这样的表格。这可能是干净利落的SQL方式。
然而,最后,我采用了Aaron的解决方案,涉及标志和简单的算法。我确实通过在while循环中包装他的算法来增强它,以保持迭代直到没有持续时间大于1。这很快且容易实施。它还强调我们确实有10个小时的预订,所以我不需要在这里硬编码一个限制。
我应该注意到,我将Jeff的最大持续时间的想法并入了while循环计数器,而不是我对持续时间> 1的项目进行计数的原始想法。代码略少。
哪个版本的SQL Server? – 2009-08-25 08:03:50
SQL Server 2000.这会有所作为吗? – dave 2009-08-25 08:05:25
SQL 2005和更高版本中有一些功能使这种查询更容易。 – 2009-08-25 08:14:10