Каков наиболее эффективный способ подсчета количества повторяющихся строк в запросе?

Я создаю отчет в SAP SQ01/SQ02, цель которого - показать, сколько раз продукт был выбран за указанный период времени.

Данные в основном получены из таблицы LTAP. Мне просто нужно иметь возможность подсчитать количество строк. Материал дублируется в XYZ, вывести число в дополнительное поле и показать значение. Также я хочу, чтобы этот подсчет происходил в указанный период времени, скажем, в последние 30 дней, чтобы убедиться, что он актуален и актуален.

Приведенный ниже код работает, но он настолько медленный, что требуется всего несколько секунд, чтобы вывести счетчик только для одного материала, и мне нужен отчет для вывода топ-1000 на основе счетчика. Есть ли более эффективный способ сделать то же самое?

DATA TAB

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.

TAB ИНИЦИАЛИЗАЦИИ

sort_f1 = 'ltap-matnr'.

TAB Обработки Записи

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.

Я ожидаю, что отчет выйдет за считанные секунды, а не минуты за пару кодов материала. Буду очень признателен за альтернативный код или улучшение текущего, которое могло бы достичь этого.

1 ответ

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 и может быть недоступно в более старых выпусках.

Другие вопросы по тегам