Oracle 版本: 19c ,Production version 19.3.0.0.0 Enterprise
使用场景:对结果集生成总计、小计效果
模拟数据:
| 数学 | 语文 | 学号 | 班级 |
|---|---|---|---|
| 90 | 80 | 0001 | 1班 |
| 80 | 95 | 0002 | 1班 |
| 77 | 99 | 0003 | 2班 |
| 95 | 85 | 0004 | 2班 |
例子 1(按照班级分组小计、班级总分) :
SELECT
NVL(班级,'总计') 班级,
CASE WHEN 班级 IS NULL THEN '-' ELSE NVL(学号,'小计') END 学号,
SUM(数学) 数学,
SUM(语文) 语文
FROM score
GROUP BY ROLLUP(班级,学号)
ORDER BY 班级,学号
| 班级 | 学号 | 数学 | 语文 |
|---|---|---|---|
| 1班 | 0001 | 90 | 80 |
| 1班 | 0002 | 80 | 95 |
| 1班 | 小计 | 170 | 175 |
| 2班 | 0003 | 77 | 99 |
| 2班 | 0004 | 95 | 85 |
| 2班 | 小计 | 172 | 184 |
| 总计 | - | 342 | 359 |
例子2 (只有总计)
SELECT
NVL(班级,'总计') 班级,
CASE WHEN 班级 IS NULL THEN '-' ELSE NVL(学号,'小计') END 学号,
SUM(数学) 数学,
SUM(语文) 语文
FROM score
GROUP BY ROLLUP((班级,学号)) -- 意思是 班级、学号组合分组
ORDER BY 班级,学号
| 班级 | 学号 | 数学 | 语文 |
|---|---|---|---|
| 1班 | 0001 | 90 | 80 |
| 1班 | 0002 | 80 | 95 |
| 2班 | 0003 | 77 | 99 |
| 2班 | 0004 | 95 | 85 |
| 总计 | - | 342 | 359 |