使用している RDBMS を指定しませんでしたが、このデータを必要な結果に変換する方法がいくつかあります。
PIVOT
関数を持たないデータベースを使用している場合は、UNION ALL
クエリを使用してデータのピボットを解除し、集計関数とCASE
式を使用して日付を列にピボットすることでこれを行うことができます。クエリは次のようになります。
select col,
cat_id,
max(case when dateon = '2013-02-12' then value end) [2013-02-12],
max(case when dateon = '2013-02-13' then value end) [2013-02-13],
max(case when dateon = '2013-02-14' then value end) [2013-02-14],
max(case when dateon = '2013-02-15' then value end) [2013-02-15]
from
(
select cat_id, 'amount1' col, amount1 value, dateon
from tbl_login
where dateon >= '2013-02-12'
and dateon <= '2013-02-15'
union all
select cat_id, 'amount2' col, cast(amount2 as decimal(10,2)) value, dateon
from tbl_login
where dateon >= '2013-02-12'
and dateon <= '2013-02-15'
union all
select cat_id, 'amount3' col, cast(amount3 as decimal(10,2)) value, dateon
from tbl_login
where dateon >= '2013-02-12'
and dateon <= '2013-02-15'
) src
group by col, cat_id
order by cat_id, col
デモで SQL Fiddle を参照してください
SQL Server 2005 以降または Oracle 11g 以降を使用している場合は、UNPIVOT
とPIVOT
関数の両方を使用できます。
select col, cat_id,
[2013-02-12], [2013-02-13],
[2013-02-14], [2013-02-15]
from
(
select cat_id, dateon,
col, value
from
(
select cat_id, amount1,
cast(amount2 as decimal(10,2)) amount2,
cast(amount3 as decimal(10,2)) amount3,
dateon
from tbl_login
where dateon >= '2013-02-12'
and dateon <= '2013-02-15'
) s
unpivot
(
value
for col in (Amount1, Amount2, Amount3)
) unpiv
) src
pivot
(
max(value)
for dateon in ([2013-02-12], [2013-02-13],
[2013-02-14], [2013-02-15])
) piv
order by cat_id, col
SQL Fiddle with Demoを参照してください。
列に変換したい日付の数が不明な場合は、動的SQLを使用できます(注:動的コードはSQLサーバーの構文です):
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@startdate datetime,
@enddate datetime
set @startdate ='2013-02-12'
set @enddate ='2013-02-15'
;with dates (dt) as
(
select @startdate
union all
select dateadd(dd, 1, dt)
from dates
where dateadd(dd, 1, dt) <= @enddate
)
select dt
into #temp
from dates
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(varchar(10), dt, 120))
from #temp
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT col, cat_id,' + @cols + '
from
(
select cat_id, dateon,
col, value
from
(
select cat_id, amount1,
cast(amount2 as decimal(10,2)) amount2,
cast(amount3 as decimal(10,2)) amount3,
dateon
from tbl_login
where dateon >= '''+convert(varchar(10), @startdate, 120)+'''
and dateon <= '''+convert(varchar(10), @enddate, 120)+'''
) s
unpivot
(
value
for col in (Amount1, Amount2, Amount3)
) unpiv
) src
pivot
(
max(value)
for dateon in (' + @cols + ')
) p
order by cat_id, col'
execute(@query)
デモで SQL Fiddle を参照してください
すべてのクエリの結果は次のとおりです。
| COL | CAT_ID | 2013-02-12 | 2013-02-13 | 2013-02-14 | 2013-02-15 |
------------------------------------------------------------------------
| amount1 | 1 | 10 | 20 | (null) | (null) |
| amount2 | 1 | 12 | 22 | (null) | (null) |
| amount3 | 1 | 12 | 22 | (null) | (null) |
| amount1 | 2 | 10 | 20 | (null) | (null) |
| amount2 | 2 | 12 | 22 | (null) | (null) |
| amount3 | 2 | 12 | 22 | (null) | (null) |
| amount1 | 3 | 10 | 20 | (null) | (null) |
| amount2 | 3 | 12 | 22 | (null) | (null) |
| amount3 | 3 | 12 | 22 | (null) | (null) |
| amount1 | 4 | 10 | (null) | (null) | (null) |
| amount2 | 4 | 12 | (null) | (null) | (null) |
| amount3 | 4 | 12 | (null) | (null) | (null) |
| amount1 | 5 | (null) | 20 | (null) | (null) |
| amount2 | 5 | (null) | 22 | (null) | (null) |
| amount3 | 5 | (null) | 22 | (null) | (null) |