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

Oracle SQL需求:仅显示Line_typ为6/1的行并累加中间行Cost

Oracle SQL 实现目标行区间成本累加需求

原始数据表

行号(Line_num)行类型(Line_typ)成本(Cost)
100060
200075000
300073000
400072000
500060
600093000
700072000
800012000

需求

仅展示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;

逻辑说明

  1. target_rows CTE:筛选出所有符合条件的目标行,通过LEAD()窗口函数获取当前目标行的下一个目标行行号,以此界定当前行需要累加的区间范围。
  2. grouped_rows CTE:将所有数据表行与对应的目标行关联,确定每一行属于哪个目标行的累加区间(即该行位于当前目标行到下一个目标行之间)。
  3. 最终查询:按目标行分组计算成本总和,使用LISTAGG()函数拼接成本计算式,根据行数决定是否显示括号内的计算明细。

查询结果

行号(Line_num)行类型(Line_typ)成本(Cost)
1000610000 (0+5000+3000+2000)
500065000 (0+3000+2000)
800012000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:54:16