简体   繁体   English

t-sql按透视查询分组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM