Seleccione una fila específica pero en función de otra función de colu

Seleccione una fila específica pero en función de otra función de columna

Probé y leí muchas publicaciones, pero aún no sé cómo manejar esta solicitud:

Tengo una tabla como la siguiente

+-------+---------------+------------+
| ID     |   Comp.    |    Role   |
+-------+---------------+------------+
| 1       |   abc         |     All     |
+-------+---------------+------------+
| 1       |   abc         |   Sales  |
+-------+---------------+------------+
| 2       |   def         |     All      |
+-------+---------------+------------+
| 3       |   zeh         |     All      |
+-------+---------------+------------+
| 3       |   zeh         |     TI      |
+-------+---------------+------------+

Me gustaría un resultado basado en roles, si una identificación específica tiene dos roles, uno es Todo y el otro es Ventas, entonces debo considerar Ventas fila

La salida debería ser algo como esto

+-------+---------------+------------+
| ID     |   Comp.    |    Role   |
+-------+---------------+------------+
| 1       |   abc         |   Sales  |
+-------+---------------+------------+
| 2       |    def        |       All    |
+-------+---------------+------------+
| 3       |   zeh         |     TI      |
+-------+---------------+------------+
Mostrar la mejor respuesta

por favor formatee en consecuencia... ¿por qué tiene 2 versiones de sql?

Hmmm. . . Creo que esto hace lo que quieres:

select t.*
from t
where t.role = 'Sales'
union all
select t.*
from t
where t.role <> 'Sales' and
      not exists (select 1 from t t2 where t2.id = t.id);

quiero la segunda fila también que tiene id 2, básicamente mi preocupación es si la misma ID y el mismo Comp tienen dos roles, uno es Todos y el otro es cualquiera, así que quiero ignorar la fila que tiene Todos los roles.

Esto funcionará si solo tiene 2 valores para Rol ('Ventas' y 'Todos')

    create table #tmp(ID INT,Comp VARCHAR(10),Role VARCHAR(10))

    insert into #tmp
    SELECT 1,'abc','All'
    union ALL
    SELECT 1,'abc','Sales'
    union ALL
    SELECT 2,'def','All'


    select ID,Comp,MAX(Role) As Role from #tmp
    Group by Id,comp

    drop table #tmp

El rol no es estático aquí solo Todo es estático

Según tengo entendido

SELECT ID,Comp,Role
FROM table1
WHERE ID IN(SELECT ID FROM table1 GROUP BY ID) AND Role != 'All'

UNION
SELECT ID,Comp,Role
FROM table1
WHERE ID IN(SELECT ID FROM table1 GROUP BY ID HAVING COUNT(ID)=1)

esto funciona bien, mira esta demostración

,no La salida debería ser algo como esto +-------+---------------+------------+ | identificación | compensación | Rol | +-------+---------------+------------------+ | 1 | abc | Ventas | +-------+---------------+------------------+ | 2 | definición | Todos | +-------+---------------+------------------+ | 3 | ze | TI | +-------+---------------+------------------+

Si tiene otras funciones, debe agregarlas al CASE WHEN

SELECT
    ID
    , Comp
    , CASE WHEN role_id = 0 THEN 'All'
           WHEN role_id = 1 THEN 'Sales'
           WHEN role_id = 2 THEN 'TI' 
           ELSE NULL END AS Role
FROM
    (
    SELECT
        ID
        , Comp
        , MAX(CASE WHEN Role = 'All' THEN 0
                   WHEN Role = 'Sales' THEN 1
                   WHEN Role = 'TI' THEN 2 END 
                   ELSE -1 END) AS role_id
    FROM 
        t 
    GROUP BY
        ID
        , Comp
    )tmp

su respuesta es correcta, pero si tengo 50 roles en la tabla, entonces cada vez que necesito agregarlo en caso de que la condición y cuando el nuevo rol agregue la consulta fallará.

UNION ALL ocupará el lugar

select * from table 
where role <> 'All'
union all
select * from table t
where not exists (
    select 1 from table 
    where id = t.id and [comp.] = t.[comp.] and role <> 'All'
)
order by 1

Resultado:

ID  Comp.   Role
1   abc    Sales
2   def    All
3   zeh    IT

id 2 fila no viene por esta consulta

@NiteeshKumar... Por error, Alise se asignó incorrectamente a la consulta interna. cheque editado.