2012-02-06 182 views
1

在一個表變換垂直字段水平結果我有這樣一個表:如何通過SQL

create table t1 { 
    person_id int, 
    item_name varchar(30), 
    item_value varchar(100) 
}; 

假設爲person_id + ITEM_NAME在複合鍵,現在我有在表中的一些數據(5個記錄) T1如下:

person_id ====item_name ====== item_value 
    1   'NAME'   'john' 
    1   'GENDER'   'M' 
    1   'DOB'   '1970/02/01' 
    1   'M_PHONE'  '1234567890' 
    1   'ADDRESS'  'Some Addresses unknown' 

現在我想用SQL(或梳理存儲過程/函數或其他)查​​詢上述結果(1的結果集)成爲:

NAME==GENDER==DOB========M_PHONE=======ADDRESS=============== 
1  M  1970/02/01 1234567890 Some Addresses unknown 

我該怎麼辦? 謝謝你的幫助。

回答

1

無論您使用的數據庫如何,您嘗試實現的概念都稱爲「數據透視表」。

下面是一個例子爲MySQL: http://en.wikibooks.org/wiki/MySQL/Pivot_table

有些數據庫已經內置的功能爲,請參見下面的鏈接。

的SQLServer: http://msdn.microsoft.com/de-de/library/ms177410.aspx

甲骨文: http://www.dba-oracle.com/t_pivot_examples.htm

您可以隨時手動創建一個支點。只需選擇結果集中的所有聚合,然後從該結果集中進行選擇。注意,就你而言,你可以使用concat將所有名稱放入一列(我認爲這是mysql中的group_concat),因爲你不知道有多少名字與person_id相關。

0

最後,我找到了解決辦法PostgreSQL中:

select * from crosstab ('select person_id, item_name, item_value from t1 where person_id = 1 ') 
as virtual_table (person_id integer, name varchar, gender varchar, dob varchar, m_phone varchar, address varchar) 

還需要安裝上的Postgres的交叉功能。查看更多:http://www.postgresql.org/docs/8.3/static/tablefunc.html