从数据库表中只选择一行,具体取决于ABAP中的列值打开SQL

问题描述:

我正在寻找一种解决方案,我只想从数据库表中选择一行,具体取决于像标志一样的列。从数据库表中只选择一行,具体取决于ABAP中的列值打开SQL

样品DB表看起来像这样:

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

A1 | N2 | X 

A1 | N3 | 

A2 | N21 | X 

A2 | N22 | 

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

我想选择标志='X'的条目或C2值的最小值。

ABAP Open SQL有可能吗?我尝试使用case语句,但没有给我所需的结果。

EDIT 1:

在上面的例子:结果将是

A1 | N2

A2 | N21

并且当该标记为假或空时:

A1 | N1

A2 | N21

当然这是可能的。实际上它不应该与标准的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). 

以下是表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. 

编辑:在您的评论后,查询可能看起来像这样。

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). 
+0

嗨@Jagger,谢谢。但在这种情况下,它会返回两行=>一个标志='X',另一个返回最小值,因为它是一个OR条件。我真正想要的是最后一行。另外,我可以通过ABAP代码来完成此操作,但是我想在不理解ABAP代码的情况下使用CDS视图的查询。 – qwerty

+0

答案的第一个版本是这样做的,但我在一小时前改变了它。现在它返回或者或者。我不太了解CDS的观点,但是当我搜索到它时,它与ABAP CDS一起出现,所以我认为可以在那里使用ABAP。 – Jagger

+0

@ Jagger-是的,当您将标志设置为true时,效果很好。但是,如果将所有条目的标志设置为false,则只会选择一个具有最小值的条目。我在标记为空的情况下需要的是属于具有min(C2)的C1(关键字段)的所有条目。我试图添加组,但并没有帮助我的事业。有任何想法吗? – qwerty