我有一个包含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
?
年和月列(GJAHR
和MONAT
(是数字列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和月份(
- 其中:
- 正常条件(确保在每个子查询中也使用它们(
- AND年份是z表中所有年份中的最高年份
- 并且该月是具有最高年份的数据集的所有月份中的最高月份
编辑:(当然,您也可以使用SELECT
和SELECT ... FOR ALL ENTRIES ...
或SELECT
和LOOP
分多个步骤选择数据。您必须思考并测试哪种解决方案最有效、最易于理解且最适合您的问题。(
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 }|.