ABAP不使用SORT语句获取薪资第二高、第三低的员工姓名
ABAP不使用SORT语句实现薪资排名查询方案
方案1:ABAP 7.40及以上版本推荐(内表数据源查询法)
不需要显式调用SORT语句,直接通过ABAP SQL的排序逻辑完成排名筛选,代码简洁且自动处理并列排名场景:
" 查询第二高base_sal对应的员工姓名 SELECT SINGLE d~fname, d~lname INTO @DATA(gv_2nd_highest_emp) FROM @gt_emp_sal AS s INNER JOIN @gt_emp_details AS d ON s~empid = d~empid ORDER BY s~base_sal DESCENDING OFFSET 1 ROWS. " 跳过最高的1行,取第二行记录 WRITE: / '第二高薪资对应员工姓名:', gv_2nd_highest_emp. " 查询第三低base_sal对应的员工姓名 SELECT SINGLE d~fname, d~lname INTO @DATA(gv_3rd_lowest_emp) FROM @gt_emp_sal AS s INNER JOIN @gt_emp_details AS d ON s~empid = d~empid ORDER BY s~base_sal ASCENDING OFFSET 2 ROWS. " 跳过前2低的2行,取第三行记录 WRITE: / '第三低薪资对应员工姓名:', gv_3rd_lowest_emp.
方案2:兼容低版本ABAP(单次遍历统计法)
仅通过一次循环遍历薪资内表,记录对应排名的薪资值和员工ID,无需对整个内表排序,适合数据量较大的场景:
DATA: gv_max1 TYPE zsp_basesal VALUE 0, " 第一高薪资 gv_max2 TYPE zsp_basesal VALUE 0, " 第二高薪资 gv_min1 TYPE zsp_basesal VALUE 99999999, " 第一低薪资 gv_min2 TYPE zsp_basesal VALUE 99999999, " 第二低薪资 gv_min3 TYPE zsp_basesal VALUE 99999999, " 第三低薪资 gv_empid_max2 TYPE zsp_empid, gv_empid_min3 TYPE zsp_empid. " 一次遍历完成所有排名统计 LOOP AT gt_emp_sal INTO gwa_emp_sal. " 统计第二高薪资及对应员工ID IF gwa_emp_sal-base_sal > gv_max1. gv_max2 = gv_max1. gv_empid_max2 = COND #( WHEN gv_max1 <> 0 THEN gv_empid_max2 ELSE gwa_emp_sal-empid ). gv_max1 = gwa_emp_sal-base_sal. ELSEIF gwa_emp_sal-base_sal > gv_max2 AND gwa_emp_sal-base_sal <> gv_max1. gv_max2 = gwa_emp_sal-base_sal. gv_empid_max2 = gwa_emp_sal-empid. ENDIF. " 统计第三低薪资及对应员工ID IF gwa_emp_sal-base_sal < gv_min1. gv_min3 = gv_min2. gv_min2 = gv_min1. gv_min1 = gwa_emp_sal-base_sal. gv_empid_min3 = COND #( WHEN gv_min2 <> 99999999 THEN gv_empid_min3 ELSE gwa_emp_sal-empid ). ELSEIF gwa_emp_sal-base_sal < gv_min2 AND gwa_emp_sal-base_sal <> gv_min1. gv_min3 = gv_min2. gv_min2 = gwa_emp_sal-base_sal. gv_empid_min3 = COND #( WHEN gv_min2 <> 99999999 THEN gv_empid_min3 ELSE gwa_emp_sal-empid ). ELSEIF gwa_emp_sal-base_sal < gv_min3 AND gwa_emp_sal-base_sal <> gv_min2 AND gwa_emp_sal-base_sal <> gv_min1. gv_min3 = gwa_emp_sal-base_sal. gv_empid_min3 = gwa_emp_sal-empid. ENDIF. ENDLOOP. " 读取第二高薪资对应员工信息 READ TABLE gt_emp_details INTO gwa_emp_details WITH KEY empid = gv_empid_max2. IF sy-subrc = 0. WRITE: / '第二高薪资对应员工姓名:', gwa_emp_details-fname, gwa_emp_details-lname. ENDIF. " 读取第三低薪资对应员工信息 READ TABLE gt_emp_details INTO gwa_emp_details WITH KEY empid = gv_empid_min3. IF sy-subrc = 0. WRITE: / '第三低薪资对应员工姓名:', gwa_emp_details-fname, gwa_emp_details-lname. ENDIF.
两种方案均未显式调用SORT关键字,满足需求要求。
内容的提问来源于stack exchange,提问作者sumedh patil
相关产品推荐
相关产品推荐

