SQL [SSMS]: как вернуть одно или другое значение, но не оба - PullRequest
1 голос
/ 10 марта 2020

У меня есть столбец с одним из двух значений: «A» или «I». Я хочу всегда возвращать «I», но нет, если существует «A», в этом случае возвращать «A».

Пример таблицы:

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

Пример результатов:

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

Обратите внимание, что у [name] 'Carl' есть два значения 'I' в поле [Active?], Поэтому он возвращает оба экземпляра. [имя] Стив также имеет два значения «I», но также и значение «A», поэтому «I» игнорируются и «A» возвращается.

Ответы [ 3 ]

4 голосов
/ 10 марта 2020

Вы можете использовать not exists:

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'
                  );

Вы также можете использовать функции окна:

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;
0 голосов
/ 10 марта 2020

Более установленный подход:

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 голосов
/ 10 марта 2020

Точный способ использования

не существует

выберите t. * Из t, где t.active = 'A' или (t.active = 'I 'и не существует (выберите 1 из t t2, где t2.name = t.name и t2.active =' A ');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...