您没有指定您正在使用什么 RDBMS,但这是一个pivot。您可以在所有数据库中使用聚合函数和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
这三个都将产生相同的结果:
| PROPERTY | BOB | FRED |
---------------------------
| Eyes | Blue | |
| Hair | Red | Brown |
| Height | | Tall |