2012-02-06 2 views
1

의해 수평 결과 테이블의 수직 필드를 변환 :방법 I이 같은 테이블이 SQL

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

가정하자 person_id로 + ITEM_NAME 해주기 I 일부 데이터 (5 개 레코드) 테이블을 복합 키가되고 아래 T1 :

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

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' 

지금 내가 될 위의 결과 (1 개 결과 집합을) 쿼리 (어떤 또는 빗질 저장 프로 시저/함수 나) SQL을 사용하려면

어떻게해야합니까? 도움 주셔서 감사합니다.

답변

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

당신은 항상 손으로 피벗을 만들 수 있습니다. 결과 집합의 모든 집계를 선택한 다음 해당 결과 집합에서 선택하기 만하면됩니다. 여러분의 경우, 얼마나 많은 이름이 person_id와 관련되어 있는지 알 수 없기 때문에, concat을 사용하여 모든 이름을 하나의 열에 넣을 수 있습니다 (저는 mysql에서 group_concat라고 생각합니다).

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) 

는 또한 포스트 그레스에 크로스 탭 기능을 설치해야합니다. 더보기 : http://www.postgresql.org/docs/8.3/static/tablefunc.html