You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL CROSSTAB转置结果异常求助:投诉类型列值被替换

问题分析与修正

你的问题核心是CROSSTAB函数的源查询字段顺序错误,还存在一处结果定义的笔误:

  • CROSSTAB要求第一个参数的查询必须返回三个字段,顺序严格为:行标识符字段、列类别字段、对应值字段
  • 你把agency放在了第一个位置,导致它被当成行标识符,而complaint_type反而成了列类别,最终结果完全偏离预期
  • 结果定义里的"DDSNY"是笔误,应该是"DSNY"

修正后的代码

CREATE EXTENSION IF NOT EXISTS tablefunc;

SELECT * FROM CROSSTAB($$
    -- 调整字段顺序:行标识符(complaint_type)、列类别(agency)、值(num_complaints)
    SELECT complaint_type, agency, COUNT(*) AS num_complaints
    FROM general
    WHERE agency IN ('DOHMH', 'DSNY')  -- 用IN简化条件写法
    GROUP BY complaint_type, agency
    ORDER BY complaint_type, agency;  -- 先按行字段排序,再按列类别排序(CROSSTAB的硬性要求)
$$) AS ct (
    complaint_type text,  -- 行:保留原投诉类型的所有值
    "DOHMH" bigint,       -- 列:对应该机构的投诉数量
    "DSNY" bigint         -- 修正笔误,去掉多余的D
);

关键说明

  • 调整字段顺序后,complaint_type会作为结果的行主键,完整保留原有所有投诉类型值
  • agency的两个取值会作为结果的列头,对应展示各类型投诉在对应机构的数量
  • 必须按行字段→列类别的顺序排序,否则CROSSTAB无法正确分组行数据

内容的提问来源于stack exchange,提问作者Sarah Binder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:02:46