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

如何利用Oracle ROLLUP函数实现指定分组的选择性汇总?

针对Oracle ROLLUP指定分组汇总的解决方案

要实现仅对Article1、Article2生成汇总行,同时隐藏'Bücher- Warensendungen'分类下的汇总行,你可以通过以下两种方式实现:

方式一:ROLLUP结合分组过滤

利用GROUPING函数识别汇总行,再通过HAVING子句过滤掉不需要的汇总结果:

SELECT 
    CASE 
        WHEN GROUPING(article) = 1 THEN 'Sum'
        ELSE article
    END AS article,
    category,
    SUM(amount) AS total_amount
FROM your_table
GROUP BY category, ROLLUP(article)
HAVING 
    -- 保留所有明细行
    (GROUPING(category) = 0 AND GROUPING(article) = 0)
    -- 仅保留Article1、Article2对应的分类汇总行
    OR (GROUPING(article) = 1 AND EXISTS (
        SELECT 1 FROM your_table t 
        WHERE t.category = your_table.category 
        AND t.article IN ('Article1', 'Article2')
    ))
    -- 排除'Bücher- Warensendungen'的汇总行
    AND NOT (GROUPING(article) = 1 AND category = 'Bücher- Warensendungen')
ORDER BY category, GROUPING(article), article;

方式二:UNION ALL拼接明细与指定汇总

这种方法更直观,分别查询明细数据和目标分组的汇总数据,再合并结果:

-- 查询所有明细行
SELECT article, category, amount AS total_amount
FROM your_table
UNION ALL
-- 仅生成Article1、Article2的分类汇总,且排除指定分类
SELECT 'Sum' AS article, category, SUM(amount) AS total_amount
FROM your_table
WHERE article IN ('Article1', 'Article2')
AND category != 'Bücher- Warensendungen'
GROUP BY category
-- 排序确保明细在前,汇总在后
ORDER BY category, 
         CASE WHEN article = 'Sum' THEN 1 ELSE 0 END,
         article;

关键说明

  • GROUPING(column):用于判断当前行是否是该列的汇总行,返回1表示是汇总行,0表示是明细行,是控制ROLLUP汇总行的核心函数。
  • 两种方式各有优劣:方式一适合已有复杂ROLLUP分组逻辑的场景,只需追加过滤条件;方式二更灵活,便于精准控制哪些分组生成汇总。

内容的提问来源于stack exchange,提问作者hajduk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:36:16