列が数個しかない場合は、静的ピボットを使用できます。
create table #temp
(
name varchar(50),
date datetime,
yesno bit
)
insert into #temp values('John', '01/01/2012', 1)
insert into #temp values('Mary', '01/01/2012', 1)
insert into #temp values('James', '01/01/2012', 1)
insert into #temp values('John', '01/02/2012', 0)
insert into #temp values('Mary', '01/02/2012', 0)
insert into #temp values('James', '01/02/2012', 0)
insert into #temp values('John', '01/03/2012', 1)
insert into #temp values('Mary', '01/03/2012', 0)
insert into #temp values('James', '01/03/2012', 1)
select name, [01/01/2012], [01/02/2012], [01/03/2012]
from
(
select name, date, cast(yesno as tinyint) as yesno
from #temp
) x
pivot
(
max(yesno)
for date in ([01/01/2012], [01/02/2012], [01/03/2012])
) p
drop table #temp
しかし、これには動的なピボットが必要なようです。これを行うには、最初にピボットする列のリストを取得してから、クエリを実行する必要があります。
create table test
(
name varchar(50),
date datetime,
yesno bit
)
insert into test values('John', '01/01/2012', 1)
insert into test values('Mary', '01/01/2012', 1)
insert into test values('James', '01/01/2012', 1)
insert into test values('John', '01/02/2012', 0)
insert into test values('Mary', '01/02/2012', 0)
insert into test values('James', '01/02/2012', 0)
insert into test values('John', '01/03/2012', 1)
insert into test values('Mary', '01/03/2012', 0)
insert into test values('James', '01/03/2012', 1)
DECLARE @cols AS VARCHAR(MAX),
@query AS VARCHAR(MAX);
SELECT @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
'],[' + convert(varchar(10), t2.date, 101)
FROM test AS t2
ORDER BY '],[' + convert(varchar(10), t2.date, 101)
FOR XML PATH('')
), 1, 2, '') + ']'
set @query = 'select name, ' + @cols + '
from
(
select name, date, cast(yesno as tinyint) as yesno
from test
) x
pivot
(
max(yesno)
for date in (' + @cols + ')
) p'
execute(@query)
動的ピボットに関する役立つリンクは次のとおりです。
SQLServerの動的列を持つピボット
不明な列数でのSQLServer2005/2008ピボットの使用(動的ピボット)
ダイナミックピボットのSOには多くの質問/回答があります。