Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将多行放入单行列中_Sql_Sql Server - Fatal编程技术网

Sql 将多行放入单行列中

Sql 将多行放入单行列中,sql,sql-server,Sql,Sql Server,我有一组SQL数据结果,这些结果概括了我每天的“非高峰时间”。我需要把这些非高峰时间的数据放到一行文字中,解释可用的小时数 e、 g.“工作日上午8:30-11:30和下午2:30-5:30,周末上午10:00-5:30” 下面是我返回的数据集的示例: DayOfWeek开始时间结束时间 1 08:30:00.0000000 11:30:00.0000000 2 08:30:00.0000000 11:30:00.0000000 3 08:30:

我有一组SQL数据结果,这些结果概括了我每天的“非高峰时间”。我需要把这些非高峰时间的数据放到一行文字中,解释可用的小时数

e、 g.“工作日上午8:30-11:30和下午2:30-5:30,周末上午10:00-5:30”

下面是我返回的数据集的示例:

DayOfWeek开始时间结束时间
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
创建一个案例语句以对工作日/周末进行分组。那就把它区分开来

 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

传统的方法是将表与自身进行自连接。 您的表格的问题是没有任何东西可以识别第一个, 一周中的第二天或第三天。为了得到这个,你 需要添加一个Rank()列。也许做一张临时桌子会让这个看起来更干净。某些SQL语言允许您使用“Using”子句仅为此查询定义此临时表

这是一个粗略的版本

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
;
如果不能使用“Using”,则在TMP_表出现的每个位置重复带有秩的子查询