Oracle SQL实现表数据总合计、累计求和、按季度求和方法
Oracle SQL实现三类统计求和方案
以下示例基于给出的测试表结构编写,假设表名为emp_sal,包含字段NAME(姓名)、AGE(年龄)、SAL(薪资)、MONTH(月份英文缩写)。
1. 普通总合计
全表所有薪资的总合计,每一行都展示相同的总计值,直接使用无分区排序的窗口函数即可:
SELECT NAME, AGE, SAL, SUM(SAL) OVER () AS TOTAL_SUM FROM emp_sal;
执行后所有行的TOTAL_SUM字段都会返回全表SAL总和700,和预期结果一致。
2. 累计求和(Running Sum)
按自然月顺序逐行累加薪资,得到截止当前月的累计值。需要注意按月份的自然顺序排序,不要直接按字符串排序避免顺序错乱:
SELECT NAME, AGE, SAL, SUM(SAL) OVER ( ORDER BY TO_DATE(MONTH, 'MON', 'NLS_DATE_LANGUAGE = AMERICAN') ) AS RUNNING_SUM FROM emp_sal;
语句中通过TO_DATE指定英文月份格式转换,加上NLS_DATE_LANGUAGE参数避免不同数据库语言环境下识别月份失败,最终会按JAN→FEB→SEP→OCT→DEC的顺序逐行累加,得到需要的累计结果。
3. 季度求和
按自然季度分组,计算每个季度的薪资总和,同季度的行展示相同的季度合计值:
SELECT NAME, AGE, SAL, MONTH, SUM(SAL) OVER ( PARTITION BY TO_CHAR( TO_DATE(MONTH, 'MON', 'NLS_DATE_LANGUAGE = AMERICAN'), 'Q' ) ) AS QUARTER_SUM FROM emp_sal;
语句先将月份转换为日期后提取季度值作为分区键,同分区(同季度)的薪资会被汇总:
- 第一季度(JAN、FEB)合计250
- 第三季度(SEP)合计200
- 第四季度(OCT、DEC)合计250
和预期输出完全匹配。
如果表中
MONTH字段本身是DATE类型,不需要嵌套TO_DATE转换,直接按日期字段排序、提取季度即可。
内容的提问来源于stack exchange,提问作者user3040157
相关产品推荐
相关产品推荐

