连接 SELECT 查询中的两列并获得 MAX

Concatenate two columns in SELECT query and get MAX

我有 table BUKRS、GJAHR、MONAT,我想 select 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.

所以在 table 中我们有:

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

如何获取行 5555 2019 11

documentation 所示,从 7.50 版开始才可以像您计划的那样连接两列。你是什​​么版本?

如果您无法让它工作或没有所需的 ABAP 版本,您可以执行以下操作。有关详细信息,请阅读 subqueries

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 ) ).

解释:

  • select 所有数据集
  • 的z-table
  • 进入 itab(因为可能有多行具有相同的最大 gjahr 和月份)
  • 其中:
    1. 正常条件(确保在每个子查询中也使用它们)
    2. AND 该年份是 z-table
    3. 中存在的所有年份中最高的
    4. 并且该月份是具有最高年份的数据集中所有月份中最高的月份

编辑(当然你也可以select你的数据分多个步骤,使用SELECTSELECT ... FOR ALL ENTRIES ...,或 SELECTLOOP。您将不得不考虑并测试哪种解​​决方案最有效、易于理解并适合您的问题。)

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 }|.

年月列(GJAHRMONAT)是数字text列(字符从0到9),但是MAX 只接受数字(非文本)列,因此您可以使用 CAST 将这些 "texts" 转换为数字,如下所示:

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 系统中测试。

注意:自 ABAP 7.50 起,CAST 函数仅接受 DEC 类型。我使用 table BKPF 而不是 zfiou_percentage 因为它存在于所有 R/3、ECC、S/4 系统中。