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

Oracle SQL能否在分类末尾行显示该分类金额总计?

可以实现,以下是两种常用的Oracle SQL方案

假设你的表结构如下(以销售表sales为例):

categoryproductamount
电子手机5000
电子平板3000
服饰T恤200
服饰裤子300

方案一:使用ROLLUP子句(推荐,简洁高效)

ROLLUP是Oracle支持的分组扩展函数,能自动生成分组小计行。结合GROUPING函数可以标记总计行,同时通过排序确保小计行在分类末尾:

SELECT
    CASE WHEN GROUPING(product) = 1 THEN '【分类总计】' ELSE category END AS category,
    CASE WHEN GROUPING(product) = 1 THEN '' ELSE product END AS product,
    SUM(amount) AS amount
FROM sales
GROUP BY ROLLUP(category, product)
HAVING GROUPING(category) = 0  -- 排除全局总计行
ORDER BY category, GROUPING(product);

说明:

  • ROLLUP(category, product)会先按category+product分组统计明细,再按category生成分类总计
  • GROUPING(product) = 1表示当前行是product维度的小计行(即分类总计)
  • ORDER BY里的GROUPING(product)会让明细行(值为0)排在前面,总计行(值为1)排在每个分类最后

方案二:使用UNION ALL手动拼接明细与总计行

如果需要更自定义的行内容(比如总计行的分类名显示特殊标识),可以用UNION ALL将明细数据和分类聚合结果拼接,再通过排序字段控制位置:

WITH detail_data AS (
    SELECT
        category,
        product,
        amount,
        0 AS sort_flag  -- 明细行排序标记,值越小越靠前
    FROM sales
),
category_total AS (
    SELECT
        category || ' 总计' AS category,
        '' AS product,
        SUM(amount) AS amount,
        1 AS sort_flag  -- 总计行排序标记,确保在分类最后
    FROM sales
    GROUP BY category
)
SELECT category, product, amount
FROM detail_data
UNION ALL
SELECT category, product, amount
FROM category_total
ORDER BY category, sort_flag;

说明:

  • 用CTE分别定义明细数据和分类总计数据,通过sort_flag字段控制排序顺序
  • 可以自由修改总计行的显示文本,比如把category || ' 总计'改成你需要的格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:25:10