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查看我的编辑,我必须将行数更改为用户和日期值的分区!!。。非常感谢。