Consulta para agrupar por valores en una columna, además de identifica

Consulta para agrupar por valores en una columna, además de identificar si un valor específico en una segunda columna aparece al menos una vez en cada grupo

Esto está relacionado con los resultados que recibí en esta pregunta:

Consulta que muestra una tabla junto con indicaciones de qué filas coinciden con otra tabla

Con algunos resultados de consulta o una tabla que estoy tratando de identificar, para cada id. de cuadro, si todas las instancias de ese id. de cuadro tienen un 'sí' en otra columna, o si hay al menos un 'no'. Todo sí resultaría en sí, cualquier no resultaría en no.

por ejemplo

Si esto fuera una mesa:

ID, Box, Match
1,Box100, yes
2,Box100, yes
3,Box100, yes
4,Box200, yes
5,Box200, no
6,Box200, yes
7,Box300, yes
8,Box300, yes
9,Box300, yes
10,Box400, no
11,Box400, no
12,Box400, yes

¿Cuál sería la consulta para proporcionar estos resultados?

Box100, yes
Box200, no
Box300, yes
Box400, no

Intenté unir dos consultas, una para el sí y otra para el no, usando la declaración ÚNICA para devolver solo una, pero eso, por supuesto, devuelve:

Box100, yes
Box200, yes
Box200, no
Box300, yes
Box400, yes
Box400, no

Que no es lo que estoy buscando.

También me pareció muy difícil determinar cómo llamarlo y, por lo tanto, buscar soluciones, de ahí mi título quizás intrincado. Así que disculpas de antemano.

Siento que la solución es probablemente bastante fácil, pero no puedo entenderlo del todo.

Gracias

Mostrar la mejor respuesta

Suponiendo que no y yes son cadenas, simplemente puede usar la agregación:

select box, min(match) as match
from t
group by box;

Esto funciona debido al orden alfabético de los valores. Una solución más general es:

select box,
       (case when sum(case when match = 'no' then 1 else 0 end) > 0
             then 'no' else 'yes'
        end) as match
from t
group by box;

Gracias Gordon, eso parece funcionar, además agregué un 'ordenar por caja' al final para obtener una buena lista en orden ascendente de ID de caja más su estado completo. Gracias de nuevo. Y gracias por la explicación del 'truco' que permite este escenario en particular, además de la solución alternativa para todos los escenarios.

La respuesta de Gordon es lo que probablemente usaría, sin embargo, podrías hacerlo de esta manera...

declare @example as table (
    exampleID int identity(1,1) not null primary key clustered
,   box       varchar(255) not null
,   match     varchar(25) not null
);

insert into @example (box, match) 

select 'Box100', 'yes' union all
select 'Box100', 'yes' union all
select 'Box100', 'yes' union all
select 'Box200', 'yes' union all
select 'Box200', 'no' union all
select 'Box200', 'yes' union all
select 'Box300', 'yes' union all
select 'Box300', 'yes' union all
select 'Box300', 'yes' union all
select 'Box400', 'no' union all
select 'Box400', 'no' union all
select 'Box400', 'yes';

    select distinct a.box
         , isnull(b.match, c.match) match
      from @example a
 left join @example b
        on a.box = b.box
       and b.match = 'no'
 left join @example c
        on a.box = c.box
       and c.match = 'yes'

Conjunto de resultados:

box     match
Box100  yes
Box200  no
Box300  yes
Box400  no