2012-12-05 4 views
4

프로젝트에서 데이터 모델이 변경되어 정보를 얻기 위해 새로운 요청을해야하지만 과거에는 모든 데이터가 같은 줄에 있지만 지금은 그 데이터의 일부분 인 것처럼 보입니다 다른 테이블에 있고, 나에게 칼럼을 돌려 준다. 그래서크로스 스톱 포스트그레스 - 행간

내 요청 반환 :

http://www.hostingpics.net/viewer.php?id=724031request.jpg

나는 쉽게라고 생각하지만 난 정말 어떻게 기능 crosstab 작품을 이해하지 않습니다. 나는이 시도 : 내가 가진, 그러나

SELECT * 
    FROM crosstab(
     'SELECT c.cd_type as typcou, c.dt_envoi as dtenvcou, c.commentaire as comment, c.signataire as signur 
      FROM comm.courrier c 
      WHERE c.id_formalite=1 
    order by 1,2', 
    'select lf.valeur as valeur from formalite.ligne_formalite lf, formalite.formalite f where lf.fk_formalite=f.id AND lf.fk_formalite=1' 
    ) 

AS c(typcou text, dtenvcou text, comment text, signataire text, valeur1 text, valeur2 text, valeur3 text); 

ERREUR : 잘못된 반환 형식 ETAT SQL : 42601 세부 사항 : 쿼리 지정 반환 튜플 7 열하지만 크로스 탭 돌아 5.

있다

누군가가 잘못된 정보를 찾도록 도와 줄 수 있습니까?

+0

주어진 스크린 샷을 기반으로 원하는 것은 거의 없습니다. 행의 특정 값을 새 열의 값으로 일치시킬 수 없습니다 (n 번째 값을 n으로 설정하지 않아도됩니다). 번째 열). 테이블 스키마를 수정하는 특정 스크립트를 만듭니다. –

+0

하지만 내가 포스트그레스의 도움을받을 때 크로스 탭을 사용하여이 작업을 수행 할 수 있다고 말합니다. http://docs.postgresqlfr.org/9.0/tablefunc.html – user1879231

답변

0

알았습니다. 당신이 자주이 작업을 수행해야합니다 경우

  1. talend

특히

  • 펜타 재스퍼 :

    SELECT * 
    FROM crosstab(
        'SELECT c.cd_type as typcou, c.dt_envoi as dtenvcou, c.commentaire as comment, c.signataire as signur, r.libelle, lf.valeur 
         FROM comm.courrier c, formalite.ligne_formalite lf, formalite.formalite f, norme.rubrique r 
         WHERE c.id_formalite=f.id AND lf.fk_formalite=f.id 
         AND c.id_formalite=1 AND r.id = lf.id_rubrique ORDER BY 1', 
         'SELECT DISTINCT libelle FROM norme.rubrique ORDER BY 1') 
    AS (typcou char, dtenvcou text, comment text, signur text, codepost text, bureau text, date text); 
    
    0

    는 우선 순위에 따라 일부 오픈 소스 ETL 스튜디오를보십시오 큰 데이터 볼륨,하지만 당신이 정말로 Postgresql을 사용해야 궁금한가요? 이러한 도구를 사용하여 하나의 데이터베이스 서버에서 다른 데이터베이스 서버로 마이그레이션 할 수도 있습니다.

    1

    귀하의 질문에 해결책으로는 formalite.libelle을 언급하지 못했습니다.

    기본 쿼리에 명시적인 JOIN 구문을 사용하도록 제안합니다. 일반적으로 읽고 이해하기가 더 쉽습니다.

    SELECT * 
    FROM crosstab(
        'SELECT c.cd_type, c.dt_envoi, c.commentaire, c.signataire 
         , r.libelle, lf.valeur 
        FROM comm.courrier    c 
        JOIN formalite.formalite  f ON f.id = c.id_formalite 
        JOIN formalite.ligne_formalite lf ON lf.fk_formalite = f.id 
        JOIN norme.rubrique   r ON r.id = lf.id_rubrique 
        WHERE c.id_formalite = 1 
        ORDER BY 1' 
    
        ,$$VALUES ('codepost'::text), ('bureau'), ('date')$$ 
        ) 
    AS (typcou char, dtenvcou text, comment text, signur text 
        , codepost text, bureau text, date text); 
    

    More explanation and links in this closely related answer.

    : 어쨌든 열 정의 목록에있는 모든 열을 밖으로 철자를 가지고 있기 때문에

    , crosstab() 함수의 두 번째 매개 변수에 대한 SELECT DISTINCT ...보다 VALUES 표현을 사용하는 것이 더 효율적입니다

    이외 : date을 열 이름으로 사용하지 않으려 고합니다.이 이름은 reserved word이고 PostgreSQL에서는 형식 이름입니다.