Присоединить строку к «предыдущей строке» в 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, т.е. некоторые операторы (например, наиболее важные подзапросы в условиях соединения или в операторах выбора или функциях LAG / LEAD) не поддерживаются в ABAP OpenSQL. Полный документ ABAP OpenSQL со всеми ограничениями находится здесь https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapselect.htm Поскольку читать его немного сложно, я рекомендую вам просто делать хорошие предложения, которые работают в «простом» SQL-агностике БД, и я проверю, работают ли они и в ABAP OpenSQL.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
143
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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 <> '', который вы добавили в свое утверждение, поскольку вы не упомянули его в текстовом описании; не стесняйтесь добавлять его по мере необходимости.

Однако учтите, что это выглядит довольно громоздко. Если возможно, я бы посоветовал вместо этого написать представление базы данных по сценарию.

Проверено в системе NW 7.52 SP03 на SAP HANA 2.0.

это код для sqlfiddle: SELECT e1.belnr e1_belnr, e1.belzeile e1_belzeile, e2.geraet e2_geraet, e2.belzeile e2_belzeile FROM dberchz1 e1 LEFT OUTER JOIN dberchz2 e2 ON e1.belnr = e2.belnr WHERE e2.belzeile = ( SELECT MAX( s.belzeile ) e2_belzeile FROM dberchz2 s WHERE s.belnr = e1.belnr AND s.belzeile <= e1.belzeile )

Sandra Rossi 01.08.2018 21:45

Другие вопросы по теме