ABAP按字段组合筛选指定数量分组统计记录的SQL实现
SAP ABAP SQL 实现按工厂动态/固定数量取Top N物料库存求和记录
一、按自定义表动态数量筛选(单SQL完全可行)
无需全量查询后循环过滤,单条ABAP Open SQL(需ABAP 7.50及以上版本,支持窗口函数)即可在数据库层面完成分组统计+动态Top N筛选,大幅减少返回的数据量。
核心逻辑:
- 对
MSEG按WERKS(工厂)、MATNR(物料)分组,统计MENGE(数量)求和值; - 关联自定义表
ZWERKS_REC,获取每个工厂对应的RECORD_COUNT(需保留的记录数); - 用
ROW_NUMBER()窗口函数按工厂分组、求和值降序排序生成行号; - 筛选行号≤对应工厂
RECORD_COUNT的记录。
示例SQL代码:
SELECT m.werks, m.matnr, m.sum_menge, z.record_count FROM ( -- 分组统计MSEG的MENGE求和值 SELECT werks, matnr, SUM(menge) AS sum_menge FROM mseg GROUP BY werks, matnr ) AS m -- 关联自定义表获取工厂对应的保留数量 INNER JOIN zwerks_rec AS z ON m.werks = z.werks -- 窗口函数生成分组内排序行号并筛选 WHERE ROW_NUMBER() OVER ( PARTITION BY m.werks ORDER BY m.sum_menge DESC ) <= z.record_count ORDER BY m.werks, m.sum_menge DESC;
注意:确保ZWERKS_REC中每个WERKS仅存在一条记录,避免关联后数据重复;若MSEG数据量极大,可添加WHERE条件(如限定过账日期)缩小统计范围。
二、固定数量筛选(每个工厂取Top N)
若无需动态数量,固定每个工厂取Top N(比如10条),写法更简洁:
示例SQL代码:
SELECT werks, matnr, sum_menge FROM ( SELECT werks, matnr, SUM(menge) AS sum_menge, -- 按工厂分组、求和值降序生成行号 ROW_NUMBER() OVER ( PARTITION BY werks ORDER BY SUM(menge) DESC ) AS rn FROM mseg GROUP BY werks, matnr ) AS m -- 筛选每个工厂的前10条记录 WHERE rn <= 10 ORDER BY werks, sum_menge DESC;
若需保留并列排名的记录(如多个物料求和值相同都保留),可将ROW_NUMBER()替换为:
RANK():相同值获相同排名,后续排名跳过(如1,1,3);DENSE_RANK():相同值获相同排名,后续排名连续(如1,1,2)。
内容的提问来源于stack exchange,提问作者mmgro27
相关产品推荐
相关产品推荐

