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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:10:25