ABAP报表如何用ORDER BY实现类似Excel的字母数字混合降序排序?
调整ABAP SELECT排序逻辑实现Excel式降序
你当前的排序问题出在字母开头项的内部排序逻辑上,多余的CAST( value AS NUMC( 3 ) )条件没有实际作用,且缺少对首字母的明确排序,导致数字部分的排序不符合预期。以下是调整后的SELECT语句:
SELECT value FROM zyg_sort ORDER BY -- 第一优先级:字母开头的项排在纯数字前面 CASE WHEN LEFT(value, 1) BETWEEN 'A' AND 'Z' THEN 1 ELSE 0 END DESCENDING, -- 第二优先级:字母开头的项按首字母降序排列(B > A) CASE WHEN LEFT(value, 1) BETWEEN 'A' AND 'Z' THEN LEFT(value, 1) ELSE '' END DESCENDING, -- 第三优先级:提取数字部分转成数值类型降序排序 CAST( CASE WHEN LEFT(value, 1) BETWEEN 'A' AND 'Z' THEN SUBSTRING(value, 2) -- 去掉首字母取剩余数字部分 ELSE value -- 纯数字直接使用原内容 END AS INTEGER ) DESCENDING INTO TABLE @DATA(lt_0arphd).
逻辑说明:
- 第一排序条件:通过
LEFT(value,1)判断是否为字母开头,字母开头的项标记为1,纯数字标记为0,降序后字母开头项排在前面。 - 第二排序条件:对字母开头的项按首字母降序排列,确保B开头的项在A开头之前,同一首字母的项集中在一起。
- 第三排序条件:提取字母项的数字部分(去掉首字母)或直接使用纯数字内容,转成
INTEGER按数值大小降序排序,这样就能实现A999 > A99 > A888、998 > 888 > 99的预期顺序。
如果你的数据库支持正则表达式,也可以用REGEXP_LIKE(value, '^[A-Z]')替代LEFT(value,1) BETWEEN 'A' AND 'Z',判断字母开头会更严谨:
SELECT value FROM zyg_sort ORDER BY CASE WHEN REGEXP_LIKE(value, '^[A-Z]') THEN 1 ELSE 0 END DESCENDING, CASE WHEN REGEXP_LIKE(value, '^[A-Z]') THEN LEFT(value, 1) ELSE '' END DESCENDING, CAST( CASE WHEN REGEXP_LIKE(value, '^[A-Z]') THEN SUBSTRING(value, 2) ELSE value END AS INTEGER ) DESCENDING INTO TABLE @DATA(lt_0arphd).
调整后执行语句,得到的排序结果会和你期望的一致:
B998 A999 A99 A888 998 888 99
内容的提问来源于stack exchange,提问作者newgeek
相关产品推荐
相关产品推荐

