postgres交叉表,错误:提供的SQL必须返回3列

时间:2018-09-03 13:47:07

标签: postgresql pivot crosstab

您好,我已经创建了一个视图,但想对其进行透视。

旋转之前的输出:

   tag1  |  qmonth1  |  qmonth2  |  sum1
 --------+-----------+-----------+--------
 name1   |  18-05   |  MAY      |  -166
 name2   |  18-05   |  MAY      |  -86
 name3   |  18-05   |  MAY      |  35
 name1   |  18-06   |  JUN      |  -102
 name2   |  18-06   |  JUN      |  -32
 name3   |  18-06   |  JUN      |  -75
 name1   |  18-09   |  AVG      |  -135
 name2   |  18-09   |  AVG      |  -52
 name3   |  18-09   |  AVG      |  -17

预期输出:

 qmonth2 | name1 | name2 | name3
 --------+-------+-------+-------
  MAY    | -166  | -86  |  35
  JUN    | -102  | -32  | -75
  AVG    | -135  | -52  | -17

我的完整查询:

SELECT tag1,qmonth2,sum1 FROM crosstab 
('SELECT tag1::text,qmonth1,qmonth2::text,sum1::numeric 
FROM public."chartdata_chart3"') 
AS ct ( "tag1" TEXT,"qmonth2" TEXT,"sum1" NUMERIC);

我收到此错误,无法解决:

ERROR:  invalid source data SQL statement
DETAIL:  The provided SQL must return 3 columns: rowid, category, and values.
SQL state: 22023

1 个答案:

答案 0 :(得分:0)

作为参数传递给crosstab()函数的

SQL语句必须返回一个row_name列,一个category列和一个value列。您的情况是qmonth2,tag1和sum1。

这是您的查询,考虑到sum1是整数,qmonth2tag1是文本:

select *
from crosstab(
  'select qmonth2, tag1, sum1
  from public."chartdata_chart3"
  ') AS ct(qmonth2 text, name1 int, name2 int, name3 int;

输出:

 qmonth2 | name1 | name2 | name3
---------+-------+-------+-------
 MAY     | -166  | -86   | 35
 JUN     | -102  | -32   | -75
 AVG     | -135  | -52   | -17

有关crosstab的工作原理的更多信息和示例,请参考manual

另外,请记住,用引号命名您的列/表会使编写每个SQL查询变得更加复杂,因此您最好不要这样做:)