2012-09-21 28 views
5

Tengo una pregunta sencilla: ¿Cómo puedo usar Conde (distintos) en SQL (Oracle para ser exactos) para devolver sólo las filas donde hay dos o más valores diferentes en un campo dado.El uso de recuento diferente para encontrar registros con 2 o más valores diferentes en un campo

esto es más fácil entenderse por ejemplo:

ACCOUNT  SALESMAN 
123   Abc 
123   Abc 

246   Abc 
246   Def 
246   Def 

369   Hij 

456   Abc 
456   Def 

En este ejemplo, las únicas cuentas con 2 repeticiones de venta diferentes habría 246 y 456, y por lo tanto, me gustaría que el resultado de la consulta a poco muestre las cuentas compartidas por 2 o más vendedores:

ACCOUNT  SALESMAN 
246   Abc 
246   Def 
456   Abc 
456   Def 

Gracias.

+0

posible duplicado de [los usuarios seleccionados tienen más de un registros distintos en mysql] (http://stackoverflow.com/questions/15237740/select-users-have-more-than-one-distinct-records-in-mysql) – Bulat

Respuesta

7

uso having:

select distinct account,salesman 
from MyTable where account in 
(
    select account 
    from MyTable 
    group by account 
    having count(distinct salesman) >= 2 
) 
order by 1,2 

Aquí está una demonstration.

+1

¡Esto no está bien! Si está agrupando por vendedor 'count (vendedor distinto)' siempre será 1, por lo que esta consulta ** nunca ** devolverá ningún resultado. [Ejemplo de SQL violín] (http://sqlfiddle.com/#!4/0e047/1) – GarethD

+1

Tiene usted razón. Lo arreglaré –

+0

Gracias por la solución – Yaaqov

5

Como la otra respuesta ha indicado que es necesario utilizar HAVING, pero no en la casa indicada. Es necesario para unirse de nuevo a la mesa de originales después de usar HAVING

SELECT DISTINCT T.Account, T.SalesMan 
FROM T 
     INNER JOIN 
     ( SELECT Account 
      FROM T 
      GROUP BY Account 
      HAVING COUNT(DISTINCT SalesMan) > 1 
     ) Dupes 
      ON Dupes.Account = T.Account 

SQL Fiddle

+0

El enlace a una simulación de SQL violín es de gran ayuda, gracias – Yaaqov

1

Esto se puede hacer con un simple GROUP BY/consulta que presenta:

select account 
from t 
group by account 
having count(distinct salesperson) > 1 

Esto devuelve el cuentas, por lo que el resultado es diferente de lo que especifique. Una forma de obtener el personal de ventas es utilizar listagg:

select account, listagg(salesperson, ',') 
from t 
group by account 
having count(distinct salesperson) > 1 

De lo contrario, la respuesta de Gareth devuelve los resultados de la manera especificada en la pregunta.

Cuestiones relacionadas