【问题标题】:t-sql group by pivot queryt-sql group by pivot 查询
【发布时间】:2015-01-29 12:15:15
【问题描述】:

我有一个结果集

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

现在我希望这些数据显示为

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

其他日子以此类推。

如何在 t-sql 查询中实现这一点?

更新: -> @Deepak 的查询:是的。因为星期天最初有两行,所以新结果集中的第二行。由于星期一或星期二没有多行,因此它为空。没有逻辑分组。想象一下,它只是任何一天的可能时间段列表。 谢谢。

【问题讨论】:

  • 您的问题的标题表明您知道自己需要做什么,您是否尝试过,如果是,请编辑您的问题以包含您到目前为止所获得的内容。
  • 这只是一个猜测。不过我不确定。
  • 如何区分两行?因为有两个sunday 并且组合可能不同,例如:在您的预期输出中,空值在第一行,值在第二行......预期结果背后的逻辑是什么?请详细说明。

标签: sql sql-server tsql select pivot


【解决方案1】:

您需要为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

结果

由于 SQL Fiddle 存在内部错误,我正在添加结果图像。

【讨论】:

  • 我认为这正是我所需要的。现在只是检查。谢谢:)
  • 欢迎 :) @Tiju John
【解决方案2】:

这应该会给你你正在寻找的结果:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2022-01-03
    • 2017-01-03
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多