PostgreSQL如何实现列转行 宽表转长表的SQL查询语句怎么写
PostgreSQL宽表转长表实现方案
你要实现的是宽表转长表(逆透视/Unpivot),和crosstab的作用完全相反:crosstab是tablefunc扩展提供的行转列(透视/Pivot)函数,用于将多行聚合为多列输出,完全不匹配你的需求,PostgreSQL也没有原生colpivot语法。
以下是两种可直接使用的实现方案:
方案1:UNION ALL实现(全版本兼容)
写法简单通用,所有PostgreSQL版本都支持:
SELECT type, 'success' AS state, success AS count FROM 你的实际表名 UNION ALL SELECT type, 'failed' AS state, failed AS count FROM 你的实际表名 ORDER BY type, state DESC;
方案2:LATERAL JOIN实现(PostgreSQL 11+ 推荐)
版本高于等于11的PostgreSQL可使用该写法,性能更优,只需扫描一次原表:
SELECT t.type, s.state, s.count FROM 你的实际表名 t CROSS JOIN LATERAL ( VALUES ('success', t.success), ('failed', t.failed) ) AS s(state, count) ORDER BY t.type, s.state DESC;
将上述SQL中的你的实际表名替换为你自己的表名,即可输出符合要求的结果。
内容的提问来源于stack exchange,提问作者SYAHRIL ASIDIQ FIRDAUS
相关产品推荐
相关产品推荐

