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
Publicado : 6 March, 2018 @ 03:39
por favor formatee en consecuencia... ¿por qué tiene 2 versiones de sql?
Publicado : 6 March, 2018 @ 03:40
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);
Publicado : 6 March, 2018 @ 03:42
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.
Publicado : 6 March, 2018 @ 05:17
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
Publicado : 6 March, 2018 @ 04:10
El rol no es estático aquí solo Todo es estático
Publicado : 6 March, 2018 @ 05:17
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
Publicado : 6 March, 2018 @ 05:31
,no La salida debería ser algo como esto +-------+---------------+------------+ | identificación | compensación | Rol | +-------+---------------+------------------+ | 1 | abc | Ventas | +-------+---------------+------------------+ | 2 | definición | Todos | +-------+---------------+------------------+ | 3 | ze | TI | +-------+---------------+------------------+
Publicado : 6 March, 2018 @ 05:33
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
Publicado : 6 March, 2018 @ 05:42
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á.
Publicado : 6 March, 2018 @ 05:48
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
Publicado : 6 March, 2018 @ 05:47
id 2 fila no viene por esta consulta
Publicado : 6 March, 2018 @ 05:50
@NiteeshKumar... Por error, Alise se asignó incorrectamente a la consulta interna. cheque editado.
Publicado : 6 March, 2018 @ 05:56