2017-10-04 2 views
1

Je recherche une solution où je veux sélectionner une seule ligne d'une table DB en fonction d'une colonne qui ressemble à un drapeau.Sélectionnez une seule ligne d'une table DB en fonction d'une valeur de colonne dans ABAP Open SQL

Une table d'échantillons de DB ressemble à ceci:

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

A1 | N2 | X 

A1 | N3 | 

A2 | N21 | X 

A2 | N22 | 

où C1 et C2 sont des champs clés. Dans cet exemple, A1 a 3 entrées et l'une d'elles a un drapeau vrai ('X').

Je veux sélectionner l'entrée avec le drapeau = 'X' ou le minimum de la valeur C2. Est-ce possible dans ABAP Open SQL?

Est-ce possible dans ABAP Open SQL? J'ai essayé d'utiliser l'instruction case mais ne me donne pas le résultat requis.

EDIT 1:

Dans l'exemple ci-dessus: résultat sera

A1 | N2

A2 | N21

et quand le drapeau est faux ou vide alors:

A1 | N1

A2 | N21

Répondre

5

Bien sûr, c'est possible. En fait, il ne devrait pas trop différer du SQL standard.

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

Voici un exemple de rapport fait avec 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. 

EDIT: Après vos commentaires, la requête pourrait ressembler à ceci.

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

Salut @Jagger, merci. Mais dans ce cas, il me renvoie deux lignes => une avec flag = 'X' et une avec une valeur min car c'est une condition OU. Ce que je veux vraiment, c'est une rangée à la fin. En outre, je peux le faire par code ABAP mais je veux utiliser la requête pour les vues CDS où il ne comprend pas le code ABAP. – qwerty

+0

La première version de la réponse l'a fait mais je l'ai changé comme il y a une heure. En ce moment, il retourne soit/ou. Je ne connais pas grand-chose des vues de la CDS mais quand je l'ai googlé, cela s'est fait avec ABAP CDS, donc je pense qu'il est possible d'utiliser ABAP là-bas. – Jagger

+0

@ Jagger- oui cela fonctionne bien quand vous avez le drapeau mis à vrai. Mais lorsque l'indicateur est défini sur false pour toutes les entrées, il sélectionne une seule entrée avec la valeur min. Ce dont j'ai besoin dans le cas d'un drapeau vide, c'est que toutes les entrées appartenant à C1 (champ clé) ayant min (C2). J'ai essayé d'ajouter un groupe mais ça n'aide pas ma cause. Des idées? – qwerty