2016-11-14 4 views
0

я следующей таблице:SQL Server - группы ID, если столбец содержит значение

ID | NR | Status 
1000 | 1 | A 
1000 | 2 | A 
1001 | 3 | A 
1002 | 4 | A 
1002 | 5 | N 
1003 | 6 | N 

мне нужно выходной сигнал, который группирует эти от ID's. Столбец NR можно игнорировать. Если одна из записей с этими ID's содержит статус A, то в качестве результата будет указан status.

Так что мой результат будет:

ID | Status 
1000 | A 
1001 | A 
1002 | A 
1003 | N 

Любые предложения/идеи?

ответ

3

Сделайте GROUP BY, используйте MIN(), чтобы выбрать минимальное значение статуса для каждого идентификатора, и A < N!

select id, min(status) 
from tablename 
group by id 
2

min() Хотя это самый простой способ, это не легко обобщать. Другой метод:

select id 
     (case when sum(case when status = 'A' then 1 else 0 end) > 0 
      then 'A' 
      else 'N' -- or whatever 
     end) as status 
from t 
group by id; 

Или, если у вас есть таблица с одной строкой на id, то я хотел бы использовать exists:

select ids.id, 
     (case when exists (select 1 from t where t.id = ids.id and t.status = 'A') 
      then 'A' else 'N' 
     end) as status 
from ids; 

Это экономит на group by агрегации и может использовать индекс (id, status) для оптимальной работы.

0

Вы хотите точно записать записи, соответствующие предикату «Если одна из записей с этими идентификаторами содержит статус А, этот статус будет дан как результат». ? Запроса можно записать просто как:

Select distinct ID, STATUS from [your working TABLE] where STATUS = 'A'. 

Надеется, что это может помочь.

Смежные вопросы