SQL从单列到多列的多个日期

SQL从单列到多列的多个日期,sql,sql-server,sql-server-2008,tsql,pivot,Sql,Sql Server,Sql Server 2008,Tsql,Pivot,如何移动一列日期,如下所示 User Date ==== ==== 001 2012/12/01 09:00 001 2012/12/01 11:00 001 2012/12/01 12:00 001 2012/12/01 13:00 001.. ... User date

如何移动一列日期,如下所示

User              Date
====              ====
001               2012/12/01 09:00
001               2012/12/01 11:00
001               2012/12/01 12:00
001               2012/12/01 13:00
001..             ...        
User  date         time1   time2   time3  time4    time5  
001   2012/12/01   09:00   11:00   12:00  13:00    14:00   
然后像下面那样列出它们

User              Date
====              ====
001               2012/12/01 09:00
001               2012/12/01 11:00
001               2012/12/01 12:00
001               2012/12/01 13:00
001..             ...        
User  date         time1   time2   time3  time4    time5  
001   2012/12/01   09:00   11:00   12:00  13:00    14:00   
感谢蓝脚公司的解决方案。我测试了脚本,得到了以下结果

2   2012/11/04  09:00:00.000    NULL    NULL    NULL    NULL    NULL    NULL
2   2012/11/08  NULL    09:00:00.000    18:00:00.000    NULL    NULL    NULL    NULL
2   2012/11/09  NULL    NULL    NULL    09:00:00.000    18:00:00.000    NULL    NULL
2   2012/11/10  NULL    NULL    NULL    NULL    NULL    09:00:00.000    18:00:00.000

在下一个日期,同一用户的时间似乎跳到最后一个空列?对于同一个用户,我有没有办法从第一列开始为下一个日期按顺序排列它们?

您没有指定您正在使用的RDBMS,但您以前用sql server标记了问题,因此我假设这就是数据库

可以使用SQL Server中的函数执行此操作。有两种方法可以做到这一点:静态(硬编码所有值)或动态(在运行时确定值)

静态轴:

动态轴:

聚合/案例版本:

如果出于某种原因您不想使用PIVOT函数,那么您也可以使用聚合函数和CASE语句

select [user], date,
  max(case when rn = 1 then time end) Time1,
  max(case when rn = 2 then time end) Time2,
  max(case when rn = 3 then time end) Time3,
  max(case when rn = 4 then time end) Time4
from
(
  select [user], convert(varchar(10), date, 111) date,
    right(convert(varchar(50), date, 121), 12) time
    , row_number() over(partition by [user], convert(varchar(10), date, 111) order by date)) rn
  from yourtable
) src
group by [user], date

三者产生相同的结果:

| USER |       DATE |        TIME1 |        TIME2 |        TIME3 |        TIME4 |
---------------------------------------------------------------------------------
|  001 | 2012/12/01 | 09:00:00.000 | 11:00:00.000 | 12:00:00.000 | 13:00:00.000 |
|  001 | 2012/12/02 | 09:00:00.000 | 11:00:00.000 | 12:00:00.000 | 13:00:00.000 |

您没有指定您正在使用的RDBMS,但是您以前用sql server标记了问题,所以我假设这就是数据库

可以使用SQL Server中的函数执行此操作。有两种方法可以做到这一点:静态(硬编码所有值)或动态(在运行时确定值)

静态轴:

动态轴:

聚合/案例版本:

如果出于某种原因您不想使用PIVOT函数,那么您也可以使用聚合函数和CASE语句

select [user], date,
  max(case when rn = 1 then time end) Time1,
  max(case when rn = 2 then time end) Time2,
  max(case when rn = 3 then time end) Time3,
  max(case when rn = 4 then time end) Time4
from
(
  select [user], convert(varchar(10), date, 111) date,
    right(convert(varchar(50), date, 121), 12) time
    , row_number() over(partition by [user], convert(varchar(10), date, 111) order by date)) rn
  from yourtable
) src
group by [user], date

三者产生相同的结果:

| USER |       DATE |        TIME1 |        TIME2 |        TIME3 |        TIME4 |
---------------------------------------------------------------------------------
|  001 | 2012/12/01 | 09:00:00.000 | 11:00:00.000 | 12:00:00.000 | 13:00:00.000 |
|  001 | 2012/12/02 | 09:00:00.000 | 11:00:00.000 | 12:00:00.000 | 13:00:00.000 |

非常感谢。是的,我正在使用SQL2008@user1833676查看我的编辑,我必须将行数更改为用户和日期值的分区!!。。非常感谢。非常感谢。是的,我正在使用SQL2008@user1833676查看我的编辑,我必须将行数更改为用户和日期值的分区!!。。非常感谢。