【发布时间】:2016-08-30 20:36:15
【问题描述】:
我正在尝试使用 Postgres 的 tablefunc 扩展的 CROSSTAB 函数对某些数据执行透视操作。数据需要先进行一些转换,我在一些常用的表表达式中进行。
但是,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;
【问题讨论】:
标签: sql postgresql pivot temp-tables crosstab