在 ABAP OpenSQL 中使用 "previous row" 加入行
Join row with "previous row" in ABAP OpenSQL
归结为基本问题,我有两张表
dberchz1 (e1)
---------------------
belnr belzeile
1 1
1 2
1 4
1 5
1 7
1 22
dberchz2 (e2/e3)
---------------------
belnr belzeile geraet
1 1 A
1 2 A
1 5 B
1 8 A
1 23 A
以下ABAP打开SQL查询(Netweaver 7.50)
SELECT e1~belnr, e1~belzeile, e2~geraet, e2~belzeile FROM dberchz1 AS e1
INNER JOIN dberchz2 AS e2 ON e1~belnr = e2~belnr AND e1~belzeile <= e2~belzeile
WHERE
e2~belzeile = ( SELECT MIN( e3~belzeile ) FROM dberchz2 AS e3 WHERE e1~belnr = e3~belnr AND e1~belzeile <= e3~belzeile AND Ae3~geraet <> '' )
产量
e1~belnr e1~belzeile e2~geraet e2~belzeile
1 1 A 1
1 2 A 2
1 4 B 5
1 5 B 5
1 7 A 8
1 22 A 23
然而,我努力实现的是
e1~belnr e1~belzeile e2~geraet e2~belzeile
1 1 A 1
1 2 A 2
1 4 *A* *2*
1 5 B 5
1 7 *B* *5*
1 22 A 23
在伪代码中:
Loop through e1 (sorted in ascending ordered by belzeile)
Assign each row of e1 the row of e2 which has the same belzeile.
If no such row exist, assign the "previous" (by belzeile) row.
e2~belzeile 在最终结果中并不是真正需要的,只是为了演示目的。
这里是 fiddle: http://sqlfiddle.com/#!9/e22c7d0/1.
有什么想法吗?
请注意,fiddle 允许的不仅仅是 ABAP OpenSQL,即一些语句(例如,连接条件或 select 语句或 LAG/LEAD 函数中最重要的子查询) 在 ABAP OpenSQL 中不受支持。带有所有限制的完整 ABAP OpenSQL 文档在此处 https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapselect.htm
由于通读它有点令人生畏,我鼓励您提出在“普通”DB 不可知 SQL 中有效的好的建议,我将检查它们是否在 ABAP OpenSQL 中也有效.
SELECT e1~belnr AS e1_belnr,
e1~belzeile AS e1_belzeile,
e2~geraet AS e2_geraet,
e2~belzeile AS e2_belzeile
FROM dberchz1 AS e1
LEFT OUTER JOIN dberchz2 AS e2
ON e1~belnr = e2~belnr
WHERE e2~belzeile = (
SELECT MAX( s~belzeile ) AS e2_belzeile
FROM dberchz2 AS s
WHERE s~belnr = e1~belnr
AND s~belzeile <= e1~belzeile )
INTO TABLE @rt_result.
最后一行实际上是 (1, 22, A, 8),而不是 (1, 22, A, 23),因为您加入了 上一个 行。
我忽略了你在陈述中混入的额外 geraet <> ''
,因为你没有在文本描述中提到它;根据需要随意添加。
但是请注意,这看起来很麻烦。如果可能的话,我建议改为编写脚本化数据库视图。
已在 SAP HANA 2.0 上的 NW 7.52 SP03 系统上验证。
归结为基本问题,我有两张表
dberchz1 (e1)
---------------------
belnr belzeile
1 1
1 2
1 4
1 5
1 7
1 22
dberchz2 (e2/e3)
---------------------
belnr belzeile geraet
1 1 A
1 2 A
1 5 B
1 8 A
1 23 A
以下ABAP打开SQL查询(Netweaver 7.50)
SELECT e1~belnr, e1~belzeile, e2~geraet, e2~belzeile FROM dberchz1 AS e1
INNER JOIN dberchz2 AS e2 ON e1~belnr = e2~belnr AND e1~belzeile <= e2~belzeile
WHERE
e2~belzeile = ( SELECT MIN( e3~belzeile ) FROM dberchz2 AS e3 WHERE e1~belnr = e3~belnr AND e1~belzeile <= e3~belzeile AND Ae3~geraet <> '' )
产量
e1~belnr e1~belzeile e2~geraet e2~belzeile
1 1 A 1
1 2 A 2
1 4 B 5
1 5 B 5
1 7 A 8
1 22 A 23
然而,我努力实现的是
e1~belnr e1~belzeile e2~geraet e2~belzeile
1 1 A 1
1 2 A 2
1 4 *A* *2*
1 5 B 5
1 7 *B* *5*
1 22 A 23
在伪代码中:
Loop through e1 (sorted in ascending ordered by belzeile)
Assign each row of e1 the row of e2 which has the same belzeile.
If no such row exist, assign the "previous" (by belzeile) row.
e2~belzeile 在最终结果中并不是真正需要的,只是为了演示目的。
这里是 fiddle: http://sqlfiddle.com/#!9/e22c7d0/1.
有什么想法吗?
请注意,fiddle 允许的不仅仅是 ABAP OpenSQL,即一些语句(例如,连接条件或 select 语句或 LAG/LEAD 函数中最重要的子查询) 在 ABAP OpenSQL 中不受支持。带有所有限制的完整 ABAP OpenSQL 文档在此处 https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapselect.htm 由于通读它有点令人生畏,我鼓励您提出在“普通”DB 不可知 SQL 中有效的好的建议,我将检查它们是否在 ABAP OpenSQL 中也有效.
SELECT e1~belnr AS e1_belnr,
e1~belzeile AS e1_belzeile,
e2~geraet AS e2_geraet,
e2~belzeile AS e2_belzeile
FROM dberchz1 AS e1
LEFT OUTER JOIN dberchz2 AS e2
ON e1~belnr = e2~belnr
WHERE e2~belzeile = (
SELECT MAX( s~belzeile ) AS e2_belzeile
FROM dberchz2 AS s
WHERE s~belnr = e1~belnr
AND s~belzeile <= e1~belzeile )
INTO TABLE @rt_result.
最后一行实际上是 (1, 22, A, 8),而不是 (1, 22, A, 23),因为您加入了 上一个 行。
我忽略了你在陈述中混入的额外 geraet <> ''
,因为你没有在文本描述中提到它;根据需要随意添加。
但是请注意,这看起来很麻烦。如果可能的话,我建议改为编写脚本化数据库视图。
已在 SAP HANA 2.0 上的 NW 7.52 SP03 系统上验证。