您好,我已经创建了一个视图,但要旋转它。
旋转前输出:

   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

最佳答案

作为参数传递给crosstab()函数的SQL语句必须返回一个行名称列、一个类别列和一个值列。在你的例子中是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查询变得更加复杂,因此最好不要这样做:)

关于postgresql - postgres交叉表,错误:提供的SQL必须返回3列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52151058/

10-15 19:38