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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:54:04