CALCS表重复code(仅两次)的total列特殊计算需求
CALCS表的Total列计算与记录合并需求
表结构
code:记录标识符(非唯一)value1、value2、value3、value4:需参与求和的数值字段price:作业成本字段
需求说明
- 所有记录需计算
total列,常规计算逻辑为:total = price + value1 + value2 + value3 + value4 - 当同一
code仅出现两次时,需将另一行的value1值加入该行的total计算,最终仅保留该code的一行记录(示例中保留第一行的其他字段值)
示例原数据
code value1 value2 value3 value4 price 001579 93,1 0 0 0 280 001585 83,13 0 0 0 250 001592 250 0 0 0 500 001592 50 0 0 0 500 001593 84 0 0 33 240
期望结果
code value1 value2 value3 value4 price total 001579 93,1 0 0 0 280 373,1 001585 83,13 0 0 0 250 333,13 001592 250 0 0 0 500 800 (第一行数值+第二行的value1) 001593 84 0 0 33 240 357
解决方案(Oracle SQL)
以下SQL通过窗口函数实现需求:
WITH code_stats AS ( SELECT *, COUNT(*) OVER (PARTITION BY code) AS code_count, SUM(value1) OVER (PARTITION BY code) AS sum_value1, ROW_NUMBER() OVER (PARTITION BY code ORDER BY code) AS row_num FROM CALCS ) SELECT code, value1, value2, value3, value4, price, CASE WHEN code_count = 2 THEN price + sum_value1 + value2 + value3 + value4 ELSE price + value1 + value2 + value3 + value4 END AS total FROM code_stats WHERE code_count != 2 OR row_num = 1 ORDER BY code;
逻辑说明
- 用
code_stats公共表表达式一次性统计每个code的出现次数、所有value1的总和,以及每个code下的行号 - 通过
CASE分支处理两种计算逻辑:出现2次的code用sum_value1替代单条的value1计算total,其他情况按常规逻辑计算 - 最后过滤掉出现2次的
code的多余行,只保留第一行
内容的提问来源于stack exchange,提问作者oraculo
相关产品推荐
相关产品推荐

