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é.
3 Réponses :
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' );
Wow, réponse rapide et efficace. Merci!
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 ');
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?"