SQL Server - 如果列包含值,则按 ID 分组

Den*_*ent 2 sql t-sql sql-server

我有下表:

ID   | NR | Status
1000 | 1  | A
1000 | 2  | A
1001 | 3  | A
1002 | 4  | A
1002 | 5  | N
1003 | 6  | N
Run Code Online (Sandbox Code Playgroud)

我需要一个将这些分组的输出ID'sNR可以忽略该列。如果具有这些的记录之一ID's包含状态 A,status则将作为结果给出。

所以我的输出是:

ID   | Status
1000 | A 
1001 | A 
1002 | A 
1003 | N 
Run Code Online (Sandbox Code Playgroud)

任何建议/想法?

Gor*_*off 5

虽然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;
Run Code Online (Sandbox Code Playgroud)

或者,如果您有一张每行一行的表格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;
Run Code Online (Sandbox Code Playgroud)

这节省了group by聚合,并且可以使用索引来(id, status)获得最佳性能。