使用している RDBMS を指定していませんでしたが、以前に質問に sql server タグを付けたので、それがデータベースであると仮定します。
この操作はPIVOT
、SQL Server の関数を使用して実行できます。これを行うには、すべての値をハードコーディングする静的方法と、実行時に値が決定される動的方法の 2 つがあります。
静的ピボット:
select *
from
(
select [user], convert(varchar(10), date, 111) date,
right(convert(varchar(50), date, 121), 12) time
, 'time'+cast(row_number() over(partition by [user], convert(varchar(10), date, 111) order by date) as varchar(10)) rn
from yourtable
) src
pivot
(
max(time)
for rn in (time1, time2, time3, time4)
) piv
デモで SQL Fiddle を参照してください
動的ピボット:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME('time'+cast(row_number() over(partition by [user], convert(varchar(10), date, 111) order by date) as varchar(10)))
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [user], date,' + @cols + ' from
(
select [user], convert(varchar(10), date, 111) date,
right(convert(varchar(50), date, 121), 12) time
, ''time''+cast(row_number() over(partition by [user], convert(varchar(10), date, 111) order by date) as varchar(10)) rn
from yourtable
) x
pivot
(
max(time)
for rn in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください
集計/CASE バージョン:
何らかの理由で関数を使用したくない場合は、ステートメント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
デモで SQL Fiddle を参照してください
3 つすべてで同じ結果が得られます。
| 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 |