如何统计内表中的重复数据?按客户统计并填充客户计数列
按销售员工统计关联唯一客户数量并填充内表字段
嘿,看你给出的示例数据,需求应该是给每个销售员工统计他们对接的不同客户总数,然后把这个数值填充到该员工每一行的「客户计数」字段里对吧?我给你几个在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
相关产品推荐
相关产品推荐

