2017-12-19 40 views
1

제목이 모두 있습니다.postgres tablefunc crosstab() 함수의 범주를 정수로 지정할 수 있습니까?

SELECT * 
FROM crosstab('...') AS ct(row_name text, category_1 text, category_2 text); 

내가 두 테이블, lab_testslab_tests_results을 가지고 문서는 다음과 같이 있습니다. lab_tests_results 행은 모두 lab_tests 테이블의 기본 키 ID 정수에 연결됩니다. 실험실 테스트 (정수로 식별)가 행 머리글이고 각 결과가 테이블에있는 피벗 테이블을 만들려고합니다. 나는 정수에서 또는 그 둘레에서 구문 오류를 해결할 수 없다.

현재 설정으로 가능합니까? 문서에서 뭔가 빠졌습니까? 또는 범주 문자열을 만들기 위해 일종의 내부 조인을 수행해야합니까? 또는 실험실 테스트에 텍스트 식별자를 사용하도록 lab_tests_results 테이블을 수정 하시겠습니까?

도움을 주셔서 감사합니다. 매우 감사.

편집 : 드미트리의 도움으로 알아 냈습니다. 그는 데이터 레이아웃을 알아 냈습니다. 그러나 내가 필요한 출력이 무엇인지 명확하지 않았습니다. 피벗 테이블을 lab_tests_results 테이블의 batch_id 번호를 기반으로 만들려고했습니다. 기본 쿼리를 캐스팅하고 데이터 유형을 캐스팅해야했습니다. 이 아래처럼 lab_tests_results 테이블에서 피벗 테이블을 제공

SELECT * 
FROM crosstab('SELECT lab_tests_results.batch_id, lab_tests.test_name, lab_tests_results.test_result::FLOAT 
       FROM lab_tests_results, lab_tests 
       WHERE lab_tests.id=lab_tests_results.lab_test AND (lab_tests.test_name LIKE ''Test Name 1'' OR lab_tests.test_name LIKE ''Test Name 2'') 
       ORDER BY 1,2' 
      ) AS final_result(batch_id VARCHAR, test_name_1 FLOAT, test_name_2 FLOAT); 

:

CREATE TABLE lab_tests (
    id INTEGER PRIMARY KEY, 
    name VARCHAR(500) 
); 

CREATE TABLE lab_tests_results (
    id INTEGER PRIMARY KEY, 
    lab_tests_id INTEGER REFERENCES lab_tests (id), 
    result TEXT 
); 

그리고 당신의 데이터는 다음과 같은 : 내가 이해한다면

batch_id |test_name_1 |test_name_2 
--------------------------------------- 
batch1  | result1 | <null> 
batch2  | result2 | result3 

답변

1

올바르게 테이블은 다음과 같이 보일 이 :

INSERT INTO lab_tests (id, name) 
VALUES (1, 'test1'), 
     (2, 'test2'); 

INSERT INTO lab_tests_results (id, lab_tests_id, result) 
VALUES (1,1,'result1'), 
     (2,1,'result2'), 
     (3,2,'result3'), 
     (4,2,'result4'), 
     (5,2,'result5'); 
모든 crosstab의 691,363,210

먼저 tablefunc의 일부입니다, 당신은 그것을 활성화해야합니다 :

CREATE EXTENSION tablefunc; 

당신은 그것을 this 대답에 따라 데이터베이스 당 하나를 실행해야합니다.

마지막 쿼리는 다음과 같이 표시됩니다

SELECT * 
FROM crosstab(
    'SELECT lt.name::TEXT, lt.id, ltr.result 
    FROM lab_tests AS lt 
    JOIN lab_tests_results ltr ON ltr.lab_tests_id = lt.id' 
) AS ct(test_name text, result_1 text, result_2 text, result_3 text); 

설명 : crosstab() 기능은 3 열을 반환해야하는 쿼리의 텍스트를 취
; (1) 그룹 이름의 열, (2) 그룹화의 열, (3) 값. 래핑 쿼리는 crosstab()이 반환하는 모든 값을 선택하고 이후 열 목록 (AS 이후의 부분)을 정의합니다. 먼저 카테고리 이름 (test_name)과 값 (result_1, result_2)이 있습니다. 내 쿼리에서 최대 3 개의 결과를 얻을 수 있습니다. 내가 3 개 이상의 결과를 얻었다면 나는 그들을 보지 않을 것입니다. 3 개 이하의 결과를 얻으면 null을 얻습니다.

이 쿼리의 결과는 다음과 같습니다

test_name |result_1 |result_2 |result_3 
--------------------------------------- 
test1  |result1 |result2 |<null> 
test2  |result3 |result4 |result5 
+0

감사 드미트리. 네가 제공 한 것으로 생각한 결과를 얻었다. 그것을 보여주기 위해 원래 게시물을 편집했습니다. – user1644030