根据ABAP Open SQL中的列值,仅从数据库表中选择一行

qwe*_*rty 1 sql database sap abap opensql

我正在寻找一个解决方案,我想从DB表中只选择一行,具体取决于像标志一样的列.

示例DB表如下所示:

C1 | C2 | C3
-----------------
A1 | N1 | 

A1 | N2 | X

A1 | N3 |

A2 | N21 | X

A2 | N22 |
Run Code Online (Sandbox Code Playgroud)

其中C1和C2是关键字段.在这个例子中,A1有3个条目,其中一个有一个标志为真('X').

我想选择带有flag ='X'的条目或C2值的最小值.

这在ABAP Open SQL中是否可行?我尝试使用case语句,但没有给我所需的结果.

编辑1:

在上面的例子中:结果将是

A1 | N2

A2 | N21

当标志为假或空时,则:

A1 | N1

A2 | N21

Jag*_*ger 5

当然有可能.实际上它与标准SQL的区别不应太大.

SELECT *
  FROM <your_table>
  WHERE
    c3 = 'X'
    OR
    NOT EXISTS ( SELECT * FROM <your_table> WHERE c3 = 'X' ) 
      AND ( c2 = ( SELECT MIN( c2 ) FROM <your_table> ) )
  INTO TABLE @DATA(lt_your_table).
Run Code Online (Sandbox Code Playgroud)

以下是使用表格完成的示例报告T000.

REPORT yyy.

SELECT *
  FROM t000
  WHERE
    mandt = '101'
    OR
    mandt = ( SELECT MIN( mandt ) FROM t000 )
      AND NOT EXISTS ( SELECT * FROM t000 WHERE mandt = '101' )
  INTO TABLE @DATA(lt_your_table).

LOOP AT lt_your_table ASSIGNING FIELD-SYMBOL(<fs_your_table>).
  WRITE <fs_your_table>-mandt.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

编辑:您的评论后,查询可能如下所示.

SELECT mandt, cccoractiv
  FROM t000
  WHERE
    cccopylock = 'X'
UNION
SELECT mandt, MIN( cccoractiv ) AS cccoractiv
  FROM t000
  WHERE
    cccopylock <> 'X'
      AND NOT EXISTS ( SELECT * FROM t000 WHERE cccopylock = 'X' )
    GROUP BY mandt
INTO TABLE @DATA(lt_your_table).
Run Code Online (Sandbox Code Playgroud)