首页 > 解决方案 > 如何以有效的方式计算查询中的重复行?

问题描述

我正在 SAP SQ01/SQ02 中创建一个报告,其目的是显示产品在指定时间范围内被挑选的次数。

数据主要来自表 LTAP。我只需要能够计算重复材料 XYZ 的行数,并将该数字输出到一个额外的字段中并显示该值。此外,我希望这个计数在指定的时间范围内发生,比如说在过去 30 天内,这是为了确保它是最新的和相关的。

下面的代码可以工作,但它太慢了,输出仅 1 种材料的计数需要几秒钟,我需要报告根据计数输出前 1000 个。有没有更有效的方法来完成同样的事情?

数据选项卡

DATA : YEAR(4) TYPE N,
       MTH(2) TYPE N,
       DAY(2) TYPE N,
       YEAR1(4) TYPE N,
       MTH1(2) TYPE N,
       DAY1(2) TYPE N,
       FROM_DATE LIKE SY-DATUM,
       count1 like LTAP-UMREZ.
FIELD-SYMBOLS <fs_dtab> TYPE STANDARD TABLE.
DATA: sort_f1 TYPE fieldname.

初始化选项卡

sort_f1 = 'ltap-matnr'.

记录处理选项卡

YEAR = SY-DATUM(4).
MTH = SY-DATUM+4(2).
DAY = SY-DATUM+6(2).
IF MTH eq 1.
    MTH1 = MTH + 11.
   ELSE.
    MTH1 = MTH - 1.
 ENDIF.
   IF MTH eq 1.
      YEAR1 = YEAR - 1.
        ELSE.
        YEAR1 = YEAR.
   ENDIF.
FROM_DATE(4) = YEAR1.
FROM_DATE+4(2) = MTH1.
FROM_DATE+6(2) = DAY.

选项卡后选择结束

ASSIGN ('%G00[]') TO <fs_dtab>.
IF <fs_dtab> IS ASSIGNED.
  SORT <fs_dtab> BY (sort_f1)
                 DESCENDING.
  DELETE ADJACENT DUPLICATES FROM <fs_dtab>
  COMPARING (sort_f1).
ENDIF.

额外字段代码

在 LTAP 中,字段 UMREZ 填充有数字“1”,因此我在这里使用它来计算重复项。

clear count.
Select sum( UMREZ ) as UMREZ
  from *LTAP into COUNT
  where *LTAP~MATNR eq LTAP-MATNR
  and *LTAP~QDATU GE from_date.

对于几个材料代码,我希望报告能在几秒钟内而不是几分钟内出来。非常感谢可以实现此目的的替代代码或对当前代码的改进。

标签: abapsap-query

解决方案


DATA materials TYPE RANGE OF matnr.

SELECT
    matnr AS material,
    COUNT(*) AS count
  FROM ltap
  INTO TABLE @DATA(result)
  WHERE matnr IN materials
    AND qdatu >= @from_date
  GROUP BY matnr.

确保列上有索引MATNR。在当前的 S/4HANA 中,有一个 HW6适合,但它仅部署在 SAP HANA 上,可能不适用于旧版本。


推荐阅读