Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法在Postgres交叉表查询中使用公共表表达式_Sql_Postgresql_Pivot_Temp Tables_Crosstab - Fatal编程技术网

Sql 无法在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',

我正在尝试使用Postgres的
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上发布一个单独的问题:)