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

如何统计内表中的重复数据?按客户统计并填充客户计数列

按销售员工统计关联唯一客户数量并填充内表字段

嘿,看你给出的示例数据,需求应该是给每个销售员工统计他们对接的不同客户总数,然后把这个数值填充到该员工每一行的「客户计数」字段里对吧?我给你几个在ABAP里常用的实现方案,都是项目里实际会用到的:

方法一:传统LOOP+哈希表统计(兼容低版本ABAP)

这种方法逻辑清晰,适合所有ABAP版本,先单独统计每个销售员工的唯一客户数,再回写到原内表:

TYPES: BEGIN OF ty_sales,
         emp TYPE char1,      " 销售员工
         cust TYPE i,         " 客户编号
         count TYPE i,        " 客户计数
       END OF ty_sales.
DATA: gt_sales TYPE TABLE OF ty_sales,
      gt_emp_cust_count TYPE HASHED TABLE OF i WITH UNIQUE KEY emp,
      gs_sales TYPE ty_sales,
      lt_temp_cust TYPE TABLE OF i.

" 初始化示例数据(实际场景中这里会是你的业务内表)
gt_sales = VALUE #(
  ( emp = 'a' cust = 1 count = 0 )
  ( emp = 'a' cust = 2 count = 0 )
  ( emp = 'b' cust = 3 count = 0 )
  ( emp = 'b' cust = 2 count = 0 )
  ( emp = 'b' cust = 4 count = 0 )
  ( emp = 'c' cust = 1 count = 0 )
).

" 第一步:统计每个销售员工的唯一客户数量
LOOP AT gt_sales INTO gs_sales.
  " 临时存储当前员工的客户,去重
  READ TABLE lt_temp_cust WITH TABLE KEY table_line = gs_sales-cust TRANSPORTING NO FIELDS.
  IF sy-subrc <> 0.
    INSERT gs_sales-cust INTO lt_temp_cust.
    " 更新哈希表中的计数
    gt_emp_cust_count[ gs_sales-emp ] = gt_emp_cust_count[ gs_sales-emp ] + 1.
  ENDIF.
  " 切换员工时清空临时客户表
  AT NEW emp.
    CLEAR lt_temp_cust.
  ENDAT.
ENDLOOP.

" 第二步:将统计结果回写到原内表的客户计数字段
LOOP AT gt_sales ASSIGNING FIELD-SYMBOL(<fs_sales>).
  <fs_sales>-count = gt_emp_cust_count[ <fs_sales>-emp ].
ENDLOOP.

" 验证输出
LOOP AT gt_sales INTO gs_sales.
  WRITE: / '员工:', gs_sales-emp, '客户:', gs_sales-cust, '客户计数:', gs_sales-count.
ENDLOOP.

方法二:ABAP 7.40+ 简洁分组统计(推荐高版本使用)

如果你的系统是ABAP 7.40及以上版本,用GROUP BY+REDUCE的组合可以一步完成统计和填充,代码更简洁高效:

TYPES: BEGIN OF ty_sales,
         emp TYPE char1,
         cust TYPE i,
         count TYPE i,
       END OF ty_sales.
DATA: gt_sales TYPE TABLE OF ty_sales,
      gt_final TYPE TABLE OF ty_sales.

" 初始化示例数据
gt_sales = VALUE #(
  ( emp = 'a' cust = 1 )
  ( emp = 'a' cust = 2 )
  ( emp = 'b' cust = 3 )
  ( emp = 'b' cust = 2 )
  ( emp = 'b' cust = 4 )
  ( emp = 'c' cust = 1 )
).

" 分组统计并生成带计数的最终内表
gt_final = VALUE #(
  FOR GROUPS <grp_emp> OF <line> IN gt_sales
  GROUP BY ( emp = <line>-emp )
  " 统计当前员工组内的唯一客户数量
  LET lv_unique_cust_count = REDUCE i(
    INIT x = 0
    FOR <unique_cust> IN GROUP <grp_emp> UNIQUE BY <unique_cust>-cust
    NEXT x = x + 1
  ) IN
  " 给组内每一行填充客户计数
  FOR <line_in_grp> IN GROUP <grp_emp>
  ( CORRESPONDING ty_sales( <line_in_grp> count = lv_unique_cust_count ) )
).

" 验证输出
LOOP AT gt_final INTO DATA(gs_final).
  WRITE: / '员工:', gs_final-emp, '客户:', gs_final-cust, '客户计数:', gs_final-count.
ENDLOOP.

小补充

如果你的需求是反过来按客户维度统计对接的销售员工数量,只需要把分组的键从emp换成cust就行,逻辑是完全一致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:19:27