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
相关产品推荐
相关产品推荐

