你沒有指定哪些RDBMS你正在使用,但這是一個樞軸。您可以在所有數據庫中使用聚合功能和CASE
表達:如果您使用的是具有一個PIVOT
功能(SQL Server 2005的+ /的Oracle 11g +)的數據庫
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 with Demo
,那麼你的代碼將類似於此:
select *
from
(
select property, name, value
from yourtable
) src
pivot
(
max(value)
for name in (Bob, Fred)
) piv
參見SQL Fiddle with Demo
上述查詢工作克不動產資產信託,如果你知道這個名字值時間提前,但如果你不這樣做,那麼你將要使用動態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 with Demo
所有這三個會產生相同的結果:
| PROPERTY | BOB | FRED |
---------------------------
| Eyes | Blue | |
| Hair | Red | Brown |
| Height | | Tall |
一個數據透視查詢,並非所有數據庫都支持。 –
Hava看看MSSQL Pivot:http://msdn.microsoft.com/en-gb/library/ms177410(v=sql.105).aspx – Tom
你使用的是什麼rdbms? – Taryn