Oracle SQL能否在分类末尾行显示该分类金额总计?
可以实现,以下是两种常用的Oracle SQL方案
假设你的表结构如下(以销售表sales为例):
| category | product | amount |
|---|---|---|
| 电子 | 手机 | 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
相关产品推荐
相关产品推荐

