多行进入单行列

时间:2017-01-31 23:57:31

标签: sql sql-server

我有一组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非常有帮助。

2 个答案:

答案 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的地方重复带有等级的子查询。