在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

年和月列(GJAHRMONAT(是数字列text列(从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函数仅从ABAP 7.50开始接受DEC类型。我使用表BKPF而不是zfiou_percentage,因为它存在于所有R/3、ECC、S/4系统中。

如文档所示,只有在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. AND年份是z表中所有年份中的最高年份
    3. 并且该月是具有最高年份的数据集的所有月份中的最高月份

编辑(当然,您也可以使用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 }|.

相关内容

  • 没有找到相关文章

最新更新