1
votes

SQL [SSMS]: comment renvoyer l'une ou l'autre valeur, mais pas les deux

J'ai une colonne avec l'une des deux valeurs, «A» ou «I». Je veux toujours renvoyer «I», mais pas si «A» existe, auquel cas, retourner «A».

Exemple de tableau:

Name   | Active?
----------------
Steve  |   A
Andrew |   I
Mark   |   A
Carl   |   I
Carl   |   I

Exemple de résultats:

Name   | Active?
----------------
Steve  |   A
Steve  |   I
Steve  |   I
Andrew |   I
Mark   |   A
Mark   |   I
Carl   |   I
Carl   |   I

Notez que [nom] 'Carl' a deux valeurs 'I' dans le champ [Active?], donc il renvoie les deux instances. [name] Steve a également deux valeurs «I», mais aussi une valeur «A», donc les «je» sont ignorés et le «A» est renvoyé.


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser n'existe pas :

select t.*
from (select t.*,
             sum(case when active = 'A' then 1 else 0 end) over (partition by name) as num_a
      from t
     ) t
where (active = 'A' and num_a > 00 or
      num_a = 0;

Vous pouvez également utiliser les fonctions de fenêtre:

select t.*
from t
where t.active = 'A' or
      (t.active = 'I' and
       not exists (select 1
                   from t t2
                   where t2.name = t.name and t2.active = 'A'
                  );


1 commentaires

Wow, réponse rapide et efficace. Merci!



0
votes

La manière exacte est d'utiliser

n'existe pas

sélectionnez t. * à partir de t où t.active = 'A' ou (t.active = 'I' et n'existe pas (sélectionnez 1 de t t2 où t2.name = t.name et t2.active = 'A ');


0 commentaires

0
votes

Approche plus définie:

SELECT t.Name, ISNULL(A."Active?", I."Active?") AS "Active?"
FROM "Example Table" AS t
LEFT JOIN "Example Table" AS A
  ON t.Name = A.Name AND A."Active?" = 'A'
LEFT JOIN "Example Table" AS I
  ON t.Name = I.Name AND I."Active?" <> 'A'
GROUP BY t.Name, A.Name, A."Active?", I.Name, I."Active?"


0 commentaires