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

ABAP按字段组合筛选指定数量分组统计记录的SQL实现

SAP ABAP SQL 实现按工厂动态/固定数量取Top N物料库存求和记录

一、按自定义表动态数量筛选(单SQL完全可行)

无需全量查询后循环过滤,单条ABAP Open SQL(需ABAP 7.50及以上版本,支持窗口函数)即可在数据库层面完成分组统计+动态Top N筛选,大幅减少返回的数据量。

核心逻辑:

  1. 对MSEG按WERKS(工厂)、MATNR(物料)分组,统计MENGE(数量)求和值;
  2. 关联自定义表ZWERKS_REC,获取每个工厂对应的RECORD_COUNT(需保留的记录数);
  3. 用ROW_NUMBER()窗口函数按工厂分组、求和值降序排序生成行号;
  4. 筛选行号≤对应工厂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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 23:04:54