2016-08-30 11 views
2

私は、Postgresのtablefunc拡張機能のCROSSTAB機能を使用して、一部のデータに対してピボット操作を実行しようとしています。データはいくつかの変換を最初に受けなければなりません。共通テーブル式で実行します。Postgresクロス集計クエリで共通テーブル式を使用できません

ただし、CROSSTABはこれらの式の結果を見ることはできません。例えば

、この正常に動作します一時テーブルからクエリソーシングデータ:

CREATE TEMPORARY TABLE 
    temporary_table 
    (name, category, category_value) 
ON COMMIT DROP 
AS (
    VALUES 
    ('A', 'foo', 1   ), 
    ('A', 'bar', 2   ), 
    ('B', 'foo', 3   ), 
    ('B', 'bar', 4   ) 
); 

SELECT * FROM 
    CROSSTAB(
    'SELECT * FROM temporary_table', 
    $$ 
     VALUES 
     ('foo'), 
     ('bar') 
    $$ 
) AS (
    name TEXT, 
    foo INT, 
    bar INT 
); 

と、予想通り、次の出力を生成します。

name | foo  | bar 
text | integer | integer 
---- | ------- | ------- 
A |  1 |  2 
B |  3 |  4 

しかし、同じクエリ、このの共通テーブル式を使用して実行されません。

WITH 
    common_table 
    (name, category, category_value) 
AS (
    VALUES 
    ('A', 'foo', 1   ), 
    ('A', 'bar', 2   ), 
    ('B', 'foo', 3   ), 
    ('B', 'bar', 4   ) 
) 
SELECT * FROM 
    CROSSTAB(
    'SELECT * FROM common_table', 
    $$ 
     VALUES 
     ('foo'), 
     ('bar') 
    $$ 
) AS (
    name TEXT, 
    foo INT, 
    bar INT 
) 

と、次のエラー生成:

ERROR: relation "common_table" does not exist 
LINE 1: SELECT * FROM common_table 
        ^
QUERY: SELECT * FROM common_table 

********** Error ********** 

ERROR: relation "common_table" does not exist 
SQL state: 42P01 

を、私はそれを取るこれは、テキストクエリ(SELECT * FROM common_table)が異なるコンテキストのいくつかの並べ替えに走る意味?


注:tablefunc拡張機能が利用可能であることをCROSSTABのために有効にする必要があります。

CREATE EXTENSION IF NOT EXISTS tablefunc; 

答えて

1

すべてを行う必要がちょうどcrosstab(text, text)関数の最初の引数として文字列内のあなたのCTEを移動していますあなたはselectステートメントで行ったように。それは適切に解析され実行されます。これは、最初の引数でソースセットを生成する完全なSQL文を提供するためです。

あなたは第二引数で行なったし、私は以下のやったような文字列の内側にあなたの引用符を二重またはドル引用符 $$を使用する必要が

SELECT * FROM 
    CROSSTAB(
    $$ 
    WITH common_table(name, category, category_value) AS (
     VALUES 
     ('A', 'foo', 1   ), 
     ('A', 'bar', 2   ), 
     ('B', 'foo', 3   ), 
     ('B', 'bar', 4   ) 
    ) 
    SELECT * FROM common_table $$, 
    $$ 
     VALUES 
     ('foo'), 
     ('bar') 
    $$ 
) AS (
    name TEXT, 
    foo INT, 
    bar INT 
); 

結果

name | foo | bar 
------+-----+----- 
A | 1 | 2 
B | 3 | 4 
関連する問題