2013-01-16 102 views
1

鑑於這樣的數據:什麼SQL查詢會產生這些結果?

Name  Property Value 
---------- ---------- ---------- 
Bob  Hair  Red  
Bob  Eyes  Blue  
Fred  Hair  Brown  
Fred  Height  Tall  

什麼SQL將被要求出示這些結果?

Property Bob  Fred 
---------- ---------- ---------- 
Hair  Red  Brown  
Eyes  Blue    
Height    Tall  

我正在使用SQL Server 2008,但通用的解決方案會很好。

+6

一個數據透視查詢,並非所有數據庫都支持。 –

+0

Hava看看MSSQL Pivot:http://msdn.microsoft.com/en-gb/library/ms177410(v=sql.105).aspx – Tom

+0

你使用的是什麼rdbms? – Taryn

回答

3

你沒有指定哪些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 | 
1

這裏是老式的方法,當然,假設每個(名稱,屬性)是獨一無二的:

SELECT Properties.Property, Bob.Value, Fred.Value 
FROM 
(
SELECT DISTINCT Property 
FROM myTable 
) Properties 
LEFT OUTER JOIN 
(
SELECT Property, Value 
FROM myTable 
WHERE Name = 'Bob' 
) Bob ON Properties.Property = Bob.Property 
LEFT OUTER JOIN 
(
SELECT Property, Value 
FROM myTable 
WHERE Name = 'Fred' 
) Fred ON Properties.Property = Fred.Property 

當然,你只能這樣做,如果你提前知道時間的列。如果你不這樣做,你可以製作和執行動態SQL,但這並非沒有問題。

根據您的RDBMS您可能能夠使用一個支點而查詢,這將簡化語法(或有可能,如果你有一個人數目不詳/名)

相關問題