Oracle SQL中新增clntamount_der列的实现方案咨询
SQL子查询实现派生列需求
需求回顾
表包含Yearmonth、code、type、clntamount列,需派生clntamount_der列:
- 当
type='base'时,填充同Yearmonth+code组内type='Total'对应的clntamount值 - 当
type='adj'或type='Total'时,该列设为0
子查询实现逻辑
- 提取分组Total值:先通过子查询筛选出所有
type='Total'的行,按Yearmonth和code分组(确保每个组合对应唯一的Total值),得到每组的Total金额。 - 关联原表赋值:将原表与子查询结果通过
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
相关产品推荐
相关产品推荐

