Объединить два столбца в запросе SELECT и получить MAX - PullRequest
1 голос
/ 25 февраля 2020

У меня есть таблица с BUKRS, GJAHR, MONAT, и я хочу выбрать MAX GJAHR & MONAT следующим образом:

SELECT MAX( concat( gjahr, monat ) ) AS year_monat
      FROM zfiou_percentage
        INTO data(lv_year_month)
      WHERE bukrs = '5555' AND
            concat( gjahr, monat ) <= '202001'
      GROUP BY year_monat.

Итак, в таблице:

BUKRS  GJAHR  MONAT
5555   2019   09   
5555   2019   10  
5555   2019   11  
5555   2020   02  

Как я могу получить линию 5555 2019 11?

Ответы [ 3 ]

4 голосов
/ 25 февраля 2020

Столбцы года и месяца (GJAHR и MONAT) являются числовыми текстовыми столбцами (символы от 0 до 9), но MAX принимает только числовой (не текстовый) столбец, поэтому вы можете использовать CAST для преобразования этих «текстов» в числа следующим образом:

SELECT MAX( CAST( gjahr AS DEC ) * 100 + CAST( monat AS DEC ) ) AS year_monat
      FROM bkpf
      WHERE bukrs = '3001' AND
            concat( gjahr, monat ) <= '202001'
        INTO @DATA(lv_year_month).

Он был протестирован в системе ABAP 7.52 SP 1.

Примечание: CAST Функция принимает тип DEC только начиная с ABAP 7.50. Я использую таблицу BKPF вместо zfiou_percentage, поскольку она существует во всех системах R / 3, E CC, S / 4.

2 голосов
/ 25 февраля 2020

Объединение двух столбцов, как вы планируете, возможно только с версии 7.50, как указано в документации . Какая у вас версия?

Если вы не можете заставить ее работать или у вас нет требуемой версии ABAP, вы можете сделать следующее. Для получения дополнительной информации читайте о подзапросах .

DATA: p_bukrs   TYPE bukrs,
      lt_result TYPE TABLE OF zfiou_percentage.

SELECT *
  FROM zfiou_percentage
  INTO CORRESPONDING FIELDS OF TABLE lt_result
 WHERE bukrs = p_bukrs 
   AND gjahr >= ALL ( SELECT gjahr
                        FROM zfiou_percentage 
                       WHERE bukrs = p_bukrs )
   AND monat >= ALL ( SELECT monat
                        FROM zfiou_percentage 
                       WHERE bukrs = p_bukrs 
                         AND gjahr >= ALL ( SELECT gjahr
                                              FROM zfiou_percentage 
                                             WHERE bukrs = p_bukrs ) ).

Объяснение :

  • выбрать все наборы данных
  • z-таблицы
  • в itab ( потому что может быть несколько строк с одинаковыми максимальными значениями gjahr и месяцем)
  • где:
    1. нормальные условия (обязательно используйте их также в каждом подзапросе)
    2. И год является самым высоким из всех лет, существующих в z-таблице
    3. И месяц является самым высоким из всех месяцев наборов данных с самыми высокими годами

Редактировать : (Конечно, вы также можете выбрать данные за несколько шагов, используя SELECT и SELECT ... FOR ALL ENTRIES ..., или SELECT и LOOP. Вам придется подумать и проверить какое решение будет наиболее эффективным, простым для понимания и подходящим для вашей проблемы.)

0 голосов
/ 25 февраля 2020
SELECT
    gjahr AS year,
    monat AS month
  FROM zfiou_percentage
    INTO TABLE DATA(selected_maxes)
  WHERE bukrs = '5555'
    AND ( gjahr < '2020'
      OR gjahr = '2020' AND monat <= '01' )
  ORDER BY
    gjahr DESC,
    monat DESC
  UP TO 1 ROWS.

DATA(selected_max) = selected_maxes[ 1 ].
DATA(max_date) = |{ selected_max-year }{ selected_max-month }|.
...