2016-11-14 64 views
0

我具有以下表:SQL服务器 - 通过ID组,如果列包含一个值

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

我需要的输出哪些组这些由ID'sNR列可以被忽略。如果其中一个带有ID's的记录包含状态A,那么status将作为结果给出。

所以我的输出是:

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

任何建议/想法?

回答

3

做一个GROUP BY,使用MIN()挑选每个id的最低状态值,并且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

您需要与谓词“匹配的记录”如果其中一个带有这些ID的记录包含状态A,则该状态将作为结果给出。 ? 该查询可写为:

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

希望这可以帮助。