Oracle SQL需求:仅显示Line_typ为6/1的行并累加中间行Cost
Oracle SQL 实现目标行区间成本累加需求
原始数据表
| 行号(Line_num) | 行类型(Line_typ) | 成本(Cost) |
|---|---|---|
| 1000 | 6 | 0 |
| 2000 | 7 | 5000 |
| 3000 | 7 | 3000 |
| 4000 | 7 | 2000 |
| 5000 | 6 | 0 |
| 6000 | 9 | 3000 |
| 7000 | 7 | 2000 |
| 8000 | 1 | 2000 |
需求
仅展示Line_typ属于(6,1)的行,同时将该行与下一个符合条件行之间所有行的Cost值累加,并且显示累加计算式。
解决方案SQL
WITH target_rows AS ( SELECT Line_num, Line_typ, Cost, -- 获取下一个目标行的行号,无下一行则为NULL LEAD(Line_num) OVER (ORDER BY Line_num) AS next_target_line FROM your_table WHERE Line_typ IN (6, 1) ), grouped_rows AS ( SELECT tr.Line_num AS target_line_num, tr.Line_typ AS target_line_typ, yt.Cost, yt.Line_num AS row_num FROM your_table yt JOIN target_rows tr ON yt.Line_num >= tr.Line_num AND (yt.Line_num < tr.next_target_line OR tr.next_target_line IS NULL) ) SELECT target_line_num AS "行号(Line_num)", target_line_typ AS "行类型(Line_typ)", -- 拼接总和与计算式,仅当多行时显示括号部分 CASE WHEN COUNT(*) > 1 THEN SUM(Cost) || ' (' || LISTAGG(Cost, '+') WITHIN GROUP (ORDER BY row_num) || ')' ELSE TO_CHAR(SUM(Cost)) END AS "成本(Cost)" FROM grouped_rows GROUP BY target_line_num, target_line_typ ORDER BY target_line_num;
逻辑说明
target_rowsCTE:筛选出所有符合条件的目标行,通过LEAD()窗口函数获取当前目标行的下一个目标行行号,以此界定当前行需要累加的区间范围。grouped_rowsCTE:将所有数据表行与对应的目标行关联,确定每一行属于哪个目标行的累加区间(即该行位于当前目标行到下一个目标行之间)。- 最终查询:按目标行分组计算成本总和,使用
LISTAGG()函数拼接成本计算式,根据行数决定是否显示括号内的计算明细。
查询结果
| 行号(Line_num) | 行类型(Line_typ) | 成本(Cost) |
|---|---|---|
| 1000 | 6 | 10000 (0+5000+3000+2000) |
| 5000 | 6 | 5000 (0+3000+2000) |
| 8000 | 1 | 2000 |
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

