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

Oracle SQL中新增clntamount_der列的实现方案咨询

SQL子查询实现派生列需求

需求回顾

表包含Yearmonth、code、type、clntamount列,需派生clntamount_der列:

  • 当type='base'时,填充同Yearmonth+code组内type='Total'对应的clntamount值
  • 当type='adj'或type='Total'时,该列设为0

子查询实现逻辑

  1. 提取分组Total值:先通过子查询筛选出所有type='Total'的行,按Yearmonth和code分组(确保每个组合对应唯一的Total值),得到每组的Total金额。
  2. 关联原表赋值:将原表与子查询结果通过Yearmonth和code关联,再用CASE语句判断当前行的type,完成赋值。

代码示例

SELECT 
    t.Yearmonth,
    t.code,
    t.type,
    t.clntamount,
    -- 根据type判断赋值
    CASE 
        WHEN t.type = 'base' THEN total_group.clntamount_total
        ELSE 0
    END AS clntamount_der
FROM 
    your_table t
-- 关联子查询获取对应分组的Total值
LEFT JOIN 
    (
        SELECT 
            Yearmonth,
            code,
            -- 用MAX确保同一分组仅取一个Total值(若存在多行会自动取最大,也可根据实际用SUM/AVG)
            MAX(clntamount) AS clntamount_total
        FROM 
            your_table
        WHERE 
            type = 'Total'
        GROUP BY 
            Yearmonth, code
    ) total_group ON t.Yearmonth = total_group.Yearmonth AND t.code = total_group.code;

补充说明

  • 子查询里用MAX(clntamount)是为了避免同一Yearmonth+code下出现多个type='Total'行的情况,若你的数据中每个分组的Total行唯一,也可以直接去掉聚合函数,仅用WHERE type='Total'筛选。
  • 使用LEFT JOIN可以保证原表中所有行都被保留,即使某个分组没有Total行,此时base行的clntamount_der会显示NULL,若需要这种情况也设为0,可以修改CASE语句为CASE WHEN t.type='base' THEN COALESCE(total_group.clntamount_total, 0) ELSE 0 END。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:10:09