从数据库表中只选择一行,具体取决于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).
嗨@Jagger,谢谢。但在这种情况下,它会返回两行=>一个标志='X',另一个返回最小值,因为它是一个OR条件。我真正想要的是最后一行。另外,我可以通过ABAP代码来完成此操作,但是我想在不理解ABAP代码的情况下使用CDS视图的查询。 – qwerty
答案的第一个版本是这样做的,但我在一小时前改变了它。现在它返回或者或者。我不太了解CDS的观点,但是当我搜索到它时,它与ABAP CDS一起出现,所以我认为可以在那里使用ABAP。 – Jagger
@ Jagger-是的,当您将标志设置为true时,效果很好。但是,如果将所有条目的标志设置为false,则只会选择一个具有最小值的条目。我在标记为空的情况下需要的是属于具有min(C2)的C1(关键字段)的所有条目。我试图添加组,但并没有帮助我的事业。有任何想法吗? – qwerty