Sql 无法在Postgres交叉表查询中使用公共表表达式
我正在尝试使用Postgres的Sql 无法在Postgres交叉表查询中使用公共表表达式,sql,postgresql,pivot,temp-tables,crosstab,Sql,Postgresql,Pivot,Temp Tables,Crosstab,我正在尝试使用Postgres的tablefuncextension的CROSSTAB函数对一些数据执行透视操作。数据首先需要进行一些转换,这是我在一些常用表表达式中执行的 但是,交叉表似乎看不到这些表达式的结果 例如,此查询可以从临时表中查找数据: CREATE TEMPORARY TABLE temporary_table (name, category, category_value) ON COMMIT DROP AS ( VALUES ('A', 'foo',
tablefunc
extension的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
扩展才能使用交叉表:
CREATE EXTENSION IF NOT EXISTS tablefunc;
您只需将CTE
作为第一个参数移动到字符串中的crosstab(text,text)
函数,就像使用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
有没有关于其他方法的想法?我在一些查询中使用了一系列cte,在交叉表中使用cte或temp表的能力将非常好。您可以使用任意多个cte作为交叉表的源。最后,它们都是一种说法的一部分。如果您需要进一步的帮助并发现您的案例不同,请确保搜索解决方案。如果运气不好,请在StackOverflow上发布一个单独的问题:)