Oracle的GROUPING_ID函数对应的PostgreSQL等效语法如何实现
Oracle GROUPING_ID/ROLLUP 逻辑转PostgreSQL实现方案
核心修正点
- 首先纠正认知误区:PostgreSQL 9.5及以上版本原生支持
GROUPING_ID函数,功能和Oracle完全一致,不需要替换为单参数的GROUPING函数,二者逻辑完全不同:GROUPING仅接收单个参数,返回0/1标识该列是否在当前分组中被聚合;GROUPING_ID接收多个参数,返回对应分组位拼接的二进制对应的整数值,和Oracle逻辑一致。 DECODE函数可以直接等价替换为CASE WHEN语法,注意GROUPING_ID返回值为整数,对比时不要加字符串引号,避免类型不匹配报错。- 原内层子查询存在非标准GROUP BY写法:Oracle允许非聚合字段不在GROUP BY子句中(非严格模式),但PostgreSQL默认开启严格分组校验,内层查询用到的
CO_NM、BIZ_NM等字段需要补充到GROUP BY子句,或者用聚合函数包裹,否则会直接报错。 - 原第一个DECODE中
GROUPING_ID参数的A._CO_ID、A._CO_NM疑似拼写错误,改写时统一修正为A.CO_ID、A.CO_NM,如果实际业务有特殊字段名可以自行调整。
改写后完整PostgreSQL代码
SELECT GROUPING_ID( A.CO_ID, A.CO_NM, A.BIZ_ID, A.BIZ_NM ) AS CHK_NUM, A.CO_ID, CASE GROUPING_ID( A.CO_ID, A.CO_NM, A.BIZ_ID, A.BIZ_NM ) WHEN 7 THEN 'count' WHEN 31 THEN 'sum' ELSE A.CO_NM END AS CO_NM, A.BIZ_ID, CASE GROUPING_ID( A.CO_ID, A.CO_NM, A.BIZ_ID, A.BIZ_NM ) WHEN 3 THEN 'count' ELSE A.BIZ_NM END AS BIZ_NM FROM ( SELECT HDO_ID, CO_ID, CO_NM, BIZ_ID, BIZ_NM -- 其他需要用到的字段可自行补充 FROM ( SELECT * FROM TAB001 UNION ALL SELECT * FROM TAB002 ) A GROUP BY HDO_ID, CO_ID, CO_NM, BIZ_ID, BIZ_NM ) A GROUP BY ROLLUP( A.CO_ID, A.CO_NM, A.BIZ_ID, A.BIZ_NM );
内容的提问来源于stack exchange,提问作者Keep
相关产品推荐
相关产品推荐

