在ABAP OpenSQL中将行与“上一行”合并

时间:2018-08-01 17:28:15

标签: sql 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 OpenSQL查询(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,只是出于演示目的。

这里是一个小提琴:http://sqlfiddle.com/#!9/e22c7d0/1

有什么想法吗?

请注意,小提琴提供的功能不仅仅限于ABAP OpenSQL,也就是说,ABAP OpenSQL不支持某些语句(例如,最重要的联接条件或select语句或LAG / LEAD函数中的子查询)。完整的ABAP OpenSQL文档(有所有限制)在此处https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapselect.htm 由于阅读起来有些艰巨,因此我建议您提出一些适用于“普通”数据库不可知的SQL的好的建议,并检查它们是否也适用于ABAP OpenSQL。

1 个答案:

答案 0 :(得分:3)

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系统上验证。