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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 23:09:02