2017-10-04 13 views
1

フラグのような列に応じてDBテーブルから1行だけを選択するソリューションを探しています。 C1とC2はキーフィールドであるABAPの列の値に応じてDBテーブルから1行のみを選択するOpen SQL

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

A1 | N2 | X 

A1 | N3 | 

A2 | N21 | X 

A2 | N22 | 

サンプルDBテーブルはこのようになります。この例では、A1は3つのエントリを持ち、そのうちの1つは真( 'X')のフラグを持っています。

フラグ= 'X'のエントリまたはC2値の最小値のいずれかを選択します。

これはABAP Open SQLで可能ですか?私はcase文を使ってみましたが、必要な結果を得られませんでした。

EDIT 1:上記の例で

:結果は

A1になります| N2

A2 | N21

フラグが偽または空の場合:

A1 | N1

A2 | N21

答えて

5

もちろん可能です。実際、標準SQLとあまり違いはありません。

ここでは、テーブル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

こんにちはジャガー、ありがとう。しかし、この場合、OR条件であるため、フラグ= 'X'の2つの行と最小値の1つの2つの行を返します。私が本当に欲しいのは、最後の行です。また、私はABAPコードでこれを行うことができますが、ABAPコードを理解できないCDSビューのクエリを使用したいと思います。 – qwerty

+0

答えの最初のバージョンはそうでしたが、1時間前に変更しました。現在、/またはどちらかを返します。私はCDSのビューをあまり知らないのですが、私がそれをGoogle検索したとき、それはABAP CDSと一緒に来たので、そこでABAPを使用することは可能だと思います。 – Jagger

+0

@ Jagger-はい、フラグがtrueに設定されているとうまく動作します。しかし、すべてのエントリに対してフラグをfalseに設定した場合、min値を持つエントリが1つだけ選択されます。フラグが空である場合に必要なのは、C1(キーフィールド)に属するすべてのエントリがmin(C2)を持つことです。グループを追加しようとしましたが、私の原因を助けません。何か案は? – qwerty

関連する問題