如何在PostgreSQL中创建数据透视表(禁用tablefunc/crosstab)
PostgreSQL 实现无扩展的数据透视视图
要实现你需要的垂直排列统计结果,无需依赖tablefunc等扩展,用基础SQL语法就能完成,具体方案如下:
最终实现代码
WITH value_list AS ( -- 定义需要统计的所有目标取值 SELECT 'Happy' AS count_val UNION ALL SELECT 'Sad' AS count_val ) SELECT vl.count_val AS "Count", -- 统计Column A中匹配当前取值的行数 COUNT(CASE WHEN t."Column A" = vl.count_val THEN 1 END) AS "Column A", -- 统计Column B中匹配当前取值的行数 COUNT(CASE WHEN t."Column B" = vl.count_val THEN 1 END) AS "Column B", -- 若存在Column C,按相同逻辑添加统计项 COUNT(CASE WHEN t."Column C" = vl.count_val THEN 1 END) AS "Column C" FROM value_list vl CROSS JOIN your_table t GROUP BY vl.count_val ORDER BY vl.count_val;
逻辑说明
value_list临时数据集:先把要统计的取值(Happy、Sad)整理成独立的行数据集,作为透视表的行标题来源。- 笛卡尔积关联:通过
CROSS JOIN让每个取值与原表所有行关联,确保每个取值都能遍历到原表的全部记录。 - 分组聚合统计:针对每个取值,用
CASE WHEN筛选匹配的列记录,再通过COUNT统计数量,最后按取值分组得到目标结构。
示例输出
针对你提供的测试数据,执行后会得到:
| Count | Column A | Column B |
|---|---|---|
| Happy | 2 | 1 |
| Sad | 1 | 2 |
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

