2012-07-31 2 views
2

은 내가 prefs 테이블을 가지고 있고, 여기에 관련 열은 다음과 같습니다 PostgreSQL의 크로스 탭/피벗 문제

section | pager_number | pager_carrier 
---------+----------------+--------------- 
     1 | 2125551234  | 
     2 |    | @att.com 
     3 |    | @something.com 

그래서 나는이 다음, 크로스 탭을 사용 :이 같은 무언가를 생산하려는

mydb=> SELECT pref_id, pref_name, pref_value FROM prefs; 
pref_id | pref_name | pref_value 
---------+--------------+---------------- 
     1 | PagerNumber | 2125551234 
     2 | PagerCarrier | @att.com 
     3 | PagerCarrier | @something.com 

PostgreSQL Crosstab Query

SELECT row_name AS section, 
     category_1::text AS pager_number, 
     category_2::text AS pager_carrier 
FROM crosstab('select pref_id::bigint, pref_name::text, pref_value::text 
    FROM prefs') 
AS ct (row_name bigint, category_1 text, category_2 text); 

모든 값이 들어가 있습니다 : 유래에 대한 예 pager_numberpager_carrier는 비어 :

section | pager_number | pager_carrier 
---------+----------------+--------------- 
     1 | 2125551234  | 
     2 | @att.com  | 
     3 | @something.com | 

사람이 무슨 일이 일어나고 있는지 볼 수 있을까요?

답변

3

테스트 케이스 (샘플 데이터를 제공하기 위해 선호하는 방법) :

CREATE TEMP TABLE prefs (pref_id int, pref_name text, pref_value text); 

INSERT INTO prefs VALUES 
(1, 'PagerNumber' , '2125551234') 
,(2, 'PagerCarrier', '@att.com') 
,(3, 'PagerCarrier', '@something.com'); 

검색어 : 귀하의 질문에 묘사 된

SELECT * 
FROM crosstab(
     'SELECT pref_id, pref_name, pref_value 
     FROM prefs 
     ORDER BY 1, 2', 

     $$VALUES ('PagerNumber'::text), ('PagerCarrier')$$ 
     ) 
AS x (section text, pager_number bigint, pager_carrier text); 

반환 정확하게 결과. PagerNumber이 유효한 bigint 수가 아닌 다른 값일 수 있다면 text을 대신 사용하십시오.

질문에서 언급 한 답변이 구형이며 처음부터 정확하지 않습니다. 내가 추가 한 proper answer with explanation and links over there.

0

대신에 :

SELECT row_name AS section, category_1::text AS pager_number, category_2::text 
AS pager_carrier 
FROM crosstab('select pref_id::bigint, pref_name::text, pref_value::text 
    FROM prefs') 
AS ct (row_name bigint, category_1 text, category_2 text); 

시도 :

SELECT * 
FROM crosstab('select pref_id::bigint, pref_name::text, pref_value::text 
FROM prefs ORDER BY 1,2') 
AS prefs (row_name bigint, carrier_1 text, carrier_2 text); 

당신이 있다면 :

pref_id | pref_name | pref_value 
    ---------+--------------+---------------- 
    1 | PagerNumber | 2125551234 
    2 | PagerCarrier | @att.com 
    3 | PagerCarrier | @something.com 
    2 | PageNumber | 2332323232 
    3 | PagerCarrier | @somethingelse.com 

당신은 얻었을 것이다 :

row_name | carrier_1 | carrier_2 
    -----+--------------+---------------- 
    1 | 2125551234  | 
    2 | @att.com  | 2332323232 
    3 | @something.com | @somethingelse.com 
,

Postgress Crosstab Reference

+0

고마워,하지만 당신의 솔루션에 차이가 없었고 나는 같은 결과를 얻을. 어디에서 구문 오류가 발생 했습니까? – nnyby

+0

죄송합니다. 시도해 보려면 게시판에 액세스 할 수 없습니다. 이 예제에서와 같이 주문을 추가하십시오. – Edmon

+0

나는 무슨 일이 일어나고 있는지보고있다. 당신은 크로스 탭을 얻고 있지만 당신이 기대하는 것처럼 보이지는 않는다. 그것은 교차 분석/선회 id 및 값입니다. 이름과 값의 조합을 더 삽입하십시오. 피벗을 표시해야합니다. 나는 또한 당신의 레이블이 당신을 혼란스럽게한다고 생각합니다. – Edmon