连接 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 和月份)
- 其中:
- 正常条件(确保在每个子查询中也使用它们)
- AND 该年份是 z-table
中存在的所有年份中最高的
- 并且该月份是具有最高年份的数据集中所有月份中最高的月份
编辑:(当然你也可以select你的数据分多个步骤,使用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 }|.
年月列(GJAHR
和MONAT
)是数字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 系统中。
我有 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 和月份)
- 其中:
- 正常条件(确保在每个子查询中也使用它们)
- AND 该年份是 z-table 中存在的所有年份中最高的
- 并且该月份是具有最高年份的数据集中所有月份中最高的月份
编辑:(当然你也可以select你的数据分多个步骤,使用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 }|.
年月列(GJAHR
和MONAT
)是数字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 系统中。