使用している RDBMS を指定していませんが、これはピボットです。CASE
すべてのデータベースで集計関数と式を使用できます。
select property,
max(case when name='Bob' then value else '' end) Bob,
max(case when name='Fred' then value else '' end) Fred
from yourtable
group by property
デモで SQL Fiddle を参照してください
関数を持つデータベースPIVOT
(SQL Server 2005+/Oracle 11g+) を使用している場合、コードは次のようになります。
select *
from
(
select property, name, value
from yourtable
) src
pivot
(
max(value)
for name in (Bob, Fred)
) piv
デモで SQL Fiddle を参照してください
上記のクエリは、名前の値が事前にわかっている場合はうまく機能しますが、そうでない場合は、動的 SQL を使用する必要があります。
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(name)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT property,' + @cols + ' from
(
select property, name, value
from yourtable
) x
pivot
(
max(value)
for name in (' + @cols + ')
) p '
execute(@query)
デモで SQL Fiddle を参照してください
3 つすべてで同じ結果が得られます。
| PROPERTY | BOB | FRED |
---------------------------
| Eyes | Blue | |
| Hair | Red | Brown |
| Height | | Tall |