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;