代码之家  ›  专栏  ›  技术社区  ›  michal

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

  •  1
  • michal  · 技术社区  · 7 年前

    旋转前输出:

       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 回复  |  直到 7 年前
        1
  •  0
  •   Kamil Gosciminski    7 年前

    SQL语句作为参数传递给 crosstab() 函数必须返回一个row\u name列、一个category列和一个value列。在您的例子中,这是qmonth2,tag1和sum1。

    这是你的问题 sum1 是一个整数, qmonth2 tag1 是文本:

    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
    

    参考 manual crosstab 作品。

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

    推荐文章