2017-12-19 17 views
1

タイトルのすべてです。postgresのtablefunc crosstab()関数のカテゴリを整数にすることはできますか?

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

私は2つのテーブル、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

まずtablefuncの一部であり、あなたはそれを有効にする必要があります

CREATE EXTENSION tablefunc; 

は、あなたはそれをthis答えあたりとしてデータベースごとに1つずつ実行する必要があります。

最終クエリは次のようになります。

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

関連する問題