Объедините два столбца в запросе SELECT и получите MAX

У меня есть таблица с 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 ?


person ekekakos    schedule 25.02.2020    source источник
comment
Что вы сейчас получаете с вашим кодом?   -  person Sandra Rossi    schedule 25.02.2020
comment
К сожалению, этот MAX( concat( gjahr, monat )) не работает.   -  person ekekakos    schedule 25.02.2020
comment
Какую версию ABAP вы используете?   -  person Sandra Rossi    schedule 25.02.2020
comment
ABAP 7.52 SP02 на HANA.   -  person ekekakos    schedule 25.02.2020
comment
Как именно не работает? Программа не компилируется, появляется сообщение об ошибке или результат не соответствует вашим ожиданиям?   -  person Legxis    schedule 25.02.2020


Ответы (3)


Столбцы года и месяца (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.

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

person Sandra Rossi    schedule 25.02.2020
comment
Спасибо Сандра. Лучшее решение. - person ekekakos; 25.02.2020
comment
Почему именно вы умножаете год на 100? - person Sasku; 27.02.2020
comment
@Sasku на 100, потому что Open SQL ожидает число для MAX, поэтому месяц июня (06) 2020 года будет преобразован как to_number('2020') * 100 + to_number('06') = 202006, тогда MAX может работать. - person Sandra Rossi; 27.02.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 и месяцем)
  • where:
    1. normal conditions (make sure to use them in every subquery as well)
    2. И год является самым высоким из всех лет, существующих в z-таблице
    3. И месяц является самым высоким из всех месяцев наборов данных с самыми высокими годами

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

person Legxis    schedule 25.02.2020
comment
В конце концов включите условие ‹= 202001 : AND ( gjahr < '2020' OR gjahr = '2020' AND monat <= '01' ). NB: приведенный выше запрос можно проверить в R/3 или S/4, заменив ZFIOU_PERCENTAGE на BKPF. - person Sandra Rossi; 25.02.2020
comment
Вопрос в том, как быть, когда gjahr = 2019 и monat = 06. Здесь результат 2019 & 02. - person ekekakos; 25.02.2020
comment
Ух ты! Очень красиво, но слишком сложно, конкатенация в itab выберет в два раза более высокую производительность. - person Suncatcher; 28.02.2020

person    schedule
comment
Это неправильно, так как в 2019 году он ищет monat ‹= 1, а именно subrc = 4. Я забыл: ORDER BY не работает. - person ekekakos; 25.02.2020
comment
Вы не можете использовать ORDER BY и SELECT SINGLE в одном выражении. - person Legxis; 26.02.2020
comment
Ха! Вы можете поверить, что я никогда этого не замечал? :-) Однако UP TO 1 ROWS должны производить почти одно и то же. - person Florian; 26.02.2020