[英]t-sql group by pivot query
I have a result set 我有结果集
name time_begin time_end
SUNDAY 00:01:00 13:59:00
SUNDAY 14:01:00 23:59:00
MONDAY 22:01:00 21:59:00
TUESDAY 00:01:00 23:59:00
WEDNESDAY 00:01:00 23:59:00
THURSDAY 00:01:00 23:59:00
FRIDAY 00:01:00 23:59:00
SATURDAY 00:01:00 23:59:00
now I want this data to be shown as 现在我希望此数据显示为
SUNDAY_begin SUNDAY_end MONDAY_begin MONDAY_end TUESDAY_begin TUESDAY_end
00:01:00 13:59:00 22:01:00 21:59:00 00:01:00 23:59:00
14:01:00 23:59:00 null null null null
and so on for other days. 以此类推。
how could I achieve this in t-sql query? 如何在T-SQL查询中实现此目的?
UPDATE: -> @Deepak's query: yes. 更新:-> @Deepak的查询:是的。 since there are initially two rows in sunday, so the second row in the new resultset. 由于星期天最初有两行,因此新结果集中的第二行。 since there are no multiple rows for Monday or Tuesday, it is null. 由于星期一或星期二没有多行,因此为null。 there is no logical grouping. 没有逻辑分组。 Imagine its just a list of possible time slots for any day. 想象一下,它只是一天中所有可能的时隙列表。 Thanks. 谢谢。
You need to get a column for ROW_NUMBER()
to get rows for repeated values in each weekdays. 您需要为ROW_NUMBER()
获取一列,以获取每个工作日中重复值的行。
;WITH CTE AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY (SELECT 0)) RNO,
NAME+'_begin' [DATECOL],time_begin
FROM yourtable
UNION ALL
SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY (SELECT 0)) RNO,
NAME+'_end',time_end
FROM yourtable
)
SELECT
MIN(CASE WHEN [DATECOL]='SUNDAY_begin' THEN time_begin END)SUNDAY_begin,
MIN(CASE WHEN [DATECOL]='SUNDAY_end' THEN time_begin END)SUNDAY_begin,
MIN(CASE WHEN [DATECOL]='MONDAY_begin' THEN time_begin END)MONDAY_begin,
MIN(CASE WHEN [DATECOL]='MONDAY_end' THEN time_begin END)MONDAY_end,
MIN(CASE WHEN [DATECOL]='TUESDAY_begin' THEN time_begin END)TUESDAY_begin,
MIN(CASE WHEN [DATECOL]='TUESDAY_end' THEN time_begin END)TUESDAY_end,
MIN(CASE WHEN [DATECOL]='WEDNESDAY_begin' THEN time_begin END)WEDNESDAY_begin,
MIN(CASE WHEN [DATECOL]='WEDNESDAY_end' THEN time_begin END)WEDNESDAY_end,
MIN(CASE WHEN [DATECOL]='THURSDAY_begin' THEN time_begin END)THURSDAY_begin,
MIN(CASE WHEN [DATECOL]='THURSDAY_end' THEN time_begin END)THURSDAY_end,
MIN(CASE WHEN [DATECOL]='FRIDAY_begin' THEN time_begin END)FRIDAY_begin,
MIN(CASE WHEN [DATECOL]='FRIDAY_end' THEN time_begin END)FRIDAY_end,
MIN(CASE WHEN [DATECOL]='SATURDAY_begin' THEN time_begin END)SATURDAY_begin,
MIN(CASE WHEN [DATECOL]='SATURDAY_end' THEN time_begin END)SATURDAY_end
FROM CTE
GROUP BY RNO
RESULT 结果
Since SQL Fiddle has internal errors, I am adding result image. 由于SQL Fiddle存在内部错误,因此我要添加结果图像。
This should give you the results you are looking for: 这应该为您提供所需的结果:
Select t1.Sunday Sunday_Begin, t2.Sunday Sunday_End, t1.Monday Monday_Begin, t2.Monday Monday_End, t1.Tuesday Tuesday_Begin, t2.Tuesday Tuesday_End, t1.Wednesday Wednesday_Begin, t2.Wednesday Wednesday_End, t1.Thursday Thursday_Begin, t2.Thursday Thursday_End, t1.Friday Friday_Begin, t2.Friday Friday_End, t1.Saturday Saturday_Begin, t2.Saturday Saturday_End
From
(Select RNo, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
from
(Select ROW_NUMBER() Over(Partition by name order by time_begin) RNo, name, time_begin
from #tbl) tb1
pivot
(min(time_begin) for name in (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)) as pv1) as t1
JOIN
(Select RNo, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
from
(Select ROW_NUMBER() Over(Partition by Name order by time_begin) RNo, name, time_end
from #tbl) tb2
pivot
(min(time_end) for name in (Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday)) as pv1) as t2 on t1.RNo = t2.RNo
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.