PostgreSQL说“返回和SQL元组描述不兼容”

xkftehaa  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(174)

我有以下数据:

ID  CLASS   VALUE
1   NHB    700905.7243
1   HBW    164216.1311
1   HBO    700905.7243
2   NHB    146023.3792
2   HBW    89543.2972
2   HBO    82152.072
3   NHB    1409818.328
3   HBW    220430.7922
3   HBO    323512.9391
4   NHB    48711.3814
4   HBW    163385.1575
4   HBO    363352.3441

字符串
我想把它重新组织成以下内容:

ID     HBO             HBW              NHB
1   700905.7243    164216.1311      700905.7243
2   82152.072      89543.2972       146023.3792
3   323512.9391    220430.7922      1409818.328
4   363352.3441    163385.1575      48711.3814


请注意,HBW、HBO和NHB列中的数值为总计(总和)。
下面是我用来创建输出的脚本:

-- CREATE EXTENSION tablefunc;

SELECT *
FROM  CROSSTAB
(
    'SELECT _tlfd.id,   
    _tlfd."class",
    _tlfd."value"
    FROM public._tlfd
    WHERE _tlfd."class" = ''HBW'' or _tlfd."class" = ''HBO'' or _tlfd."class" = ''NHB'' 
    ORDER BY 1,2'
) 
    AS
(
    "class" int, 
    "HBW" text,
    "HBO" text,
    "NHB" text,
    --"Purpose" varchar, 
    "value" double precision
);


当我运行脚本时,我得到这个错误:

ERROR:  return and sql tuple descriptions are incompatible.


我在剧本里做错了什么?

bnl4lu3b

bnl4lu3b1#

我在PostGres 9.3中使用:

SELECT *
FROM   crosstab (
 $$SELECT id, class, "value"
   FROM   _tlfd
   WHERE  class = ANY ('{HBW, HBO, NHB}')
   ORDER  BY 1,2$$
   ) AS t (
        class int,                   -- needs a table alias!
        "HBW" float8,                -- resulting columns are double precision!
        "HBO" float8,
        "NHB" float8
        -- "value" double precision  -- column does not exist in result!
    );

字符串
生成所需的输出。

基本更改

  • 表别名(粗体**t**)
  • 去除的剩余列"value"
  • 数据列的正确数据类型(double precision,也称为float8

剩下的就是品味和风格的问题了,不过我不会用value作为列名,因为它是一个reserved word in SQL
crosstab()查询的基本知识:

  • PostgreSQL交叉表查询

相关问题