ABAP类SELECT语句中字符串转小数计算律师平均评分的方案
解决ABAP中字符串评分转数值计算平均的问题
首先你的代码存在几个关键问题:
- 类型定义里
t_lawyer的rating是string类型,无法存储计算后的平均分数值 - SELECT语句里
ID_LAW as rating的别名写错,应该对应t_lawyer的id字段 - 未使用聚合函数
AVG计算分组平均,且CONV不能直接在SELECT语句中做类型转换,需改用CAST
以下是修正后的完整代码:
class ZCL_LAWYER_RATINGS_TEST definition public final create public . public section. TYPES: BEGIN OF t_lawyer, id TYPE c LENGTH 10, avg_rating TYPE p DECIMALS 1, " 改为数值类型存储平均评分 END OF t_lawyer, tt_lawyer TYPE TABLE OF t_lawyer. DATA: lawyers TYPE tt_lawyer. protected section. private section. METHODS: get_lawyers IMPORTING rating_threshold TYPE string. ENDCLASS. CLASS ZCL_LAWYER_RATINGS_TEST IMPLEMENTATION. METHOD get_lawyers. DATA: lv_threshold TYPE p DECIMALS 1. " 先将输入的字符串阈值转成数值,避免SELECT内重复转换及报错 TRY. lv_threshold = CONV #( rating_threshold ). CATCH cx_sy_conversion_error. " 处理阈值非法的情况,比如非数字格式,此处可清空表或抛出异常 CLEAR lawyers. RETURN. ENDTRY. SELECT ID_LAW AS id, AVG( CAST( rating_LAW AS p DECIMALS 1 ) ) AS avg_rating INTO TABLE @lawyers FROM LAWYERS_STAT WHERE CAST( rating_LAW AS p DECIMALS 1 ) >= @lv_threshold GROUP BY ID_LAW. ENDMETHOD. ENDCLASS.
关键修改说明:
- 类型适配:把
t_lawyer的avg_rating改为p DECIMALS 1类型,匹配评分的小数格式,确保能存储平均计算结果 - 字段转换:在SELECT中用
CAST(rating_LAW AS p DECIMALS 1)将字符串评分转为数值,才能使用AVG()计算分组平均值 - 阈值处理:提前将输入的字符串阈值转为数值,避免SELECT内重复转换,同时捕获转换失败的异常
- 别名修正:调整SELECT字段别名,确保和内表结构一一对应
如果你的评分需要更高精度(比如两位小数),只需把DECIMALS 1改成对应数字即可。若表中存在无法转换为数值的非法字符串,可通过CASE语句过滤,示例:
AVG( CASE WHEN rating_LAW CO '0123456789.' THEN CAST( rating_LAW AS p DECIMALS 1 ) ELSE 0 END ) AS avg_rating
内容的提问来源于stack exchange,提问作者kiewic
相关产品推荐
相关产品推荐

