2012-02-06 56 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