我有一组SQL数据结果,概述了我每天的“非高峰时段”。我需要将这个非高峰时段的数据放到一个文本行中,以解释可用的小时数。
e.g。 “工作日上午8:30 - 上午11:30和下午2:00 - 下午5:30,周末上午10:00 - 下午5:30”
下面的是我返回的数据集的示例:
DayOfWeek StartTime EndTime
1 08:30:00.0000000 11:30:00.0000000
2 08:30:00.0000000 11:30:00.0000000
3 08:30:00.0000000 11:30:00.0000000
4 08:30:00.0000000 11:30:00.0000000
5 08:30:00.0000000 11:30:00.0000000
6 10:00:00.0000000 17:30:00.0000000
1 14:00:00.0000000 17:30:00.0000000
2 14:00:00.0000000 17:30:00.0000000
3 14:00:00.0000000 17:30:00.0000000
4 14:00:00.0000000 17:30:00.0000000
5 14:00:00.0000000 17:30:00.0000000
7 10:00:00.0000000 17:30:00.0000000
我从来没有写过任何接近于思考如何做到这一点的SQL ......一些指导对于学习如何进行这种复杂的SQL非常有帮助。
答案 0 :(得分:0)
创建CASE语句以对工作日/周末进行分组。然后就把它分开了。
SELECT distinct
CASE WHEN DayOfWeek in (1,7) THEN 'weekend' ELSE 'weekday' END as dow
,starttime, endtime
FROM table
虽然看到你想要它在一条线上,但我们强迫一个支点。
SELECT
min(CASE WHEN DayOfWeek in (1,7) THEN starttime END) as start_wknd
,min(CASE WHEN DayOfWeek in (1,7) THEN endtime END) as end_wknd
,min(CASE WHEN DayOfWeek not in (1,7) THEN starttime END) as start_wkday
,min(CASE WHEN DayOfWeek not in (1,7) THEN endtime END) as end_wkday
FROM table
答案 1 :(得分:0)
传统的方法是将表格自行连接到自身。 你的表的问题是没有什么可以识别第一个, 一周的第二次或第三次出现。为了得到这个,你 需要添加一个Rank()列。也许制作临时表会使这看起来更干净。一些SQL语言允许您使用"使用"子句,仅为此查询定义此临时表。
这是一个粗略的版本
Using TMP_TABLE as (select DayOfWeek, StartTime,EndTime,rank() order by
StartTime partition by dayofweek as Rnk )
select
A.DayOfWeek, A.StartTime, A.EndTime,
B.StartTime, B.EndTime,
C.StartTime, C.EndTime
from TMP_TABLE A
inner join TMP_TABLE B on A.DayOfWeek = B.DayOfWeek
inner join TMP_TABLE C on A.Dayofweek = C.DayOfWeek
where
A.Rnk = 1
and B.Rnk = 2
and C.Rnk = 3
;
如果你不能使用"使用"然后在每个出现TMP_TABLE的地方重复带有等级的子查询。