2012-09-21 5 views
5

Mam proste pytanie: Jak używać Count (Distinct) w SQL (dokładnie Oracle), aby zwracać tylko wiersze, w których są dwa lub bardziej różne wartości w danej dziedzinie.Używanie count distinct do znajdowania rekordów z 2 lub więcej różnymi wartościami w polu

to łatwiej zrozumiałe przykład:

ACCOUNT  SALESMAN 
123   Abc 
123   Abc 

246   Abc 
246   Def 
246   Def 

369   Hij 

456   Abc 
456   Def 

W tym przykładzie, tylko Relacje z 2 różnych powtórzeń sprzedaży będzie 246 i 456, a więc chciałbym wynik kwerendy do tylko pokaż konta udostępnione przez 2 lub więcej sprzedawców:

ACCOUNT  SALESMAN 
246   Abc 
246   Def 
456   Abc 
456   Def 

Dzięki.

+0

możliwy duplikat [wybierz użytkowników ma więcej niż jeden odrębny rekord w mysql] (http://stackoverflow.com/questions/15237740/select-users-have-more-than-one-distinct-records-in-mysql) – Bulat

Odpowiedz

7

użycie 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 

Oto demonstration.

+1

To nie w porządku! Jeśli grupujesz według sprzedawcy 'count (odrębny sprzedawca)' zawsze będzie 1, więc to zapytanie ** nigdy ** nie zwróci żadnych wyników. [Przykład na Fiddle SQL] (http://sqlfiddle.com/#!4/0e047/1) – GarethD

+1

Masz rację. Naprawię to –

+0

Dzięki za rozwiązanie – Yaaqov

5

Jak wskazano w innej odpowiedzi, należy użyć HAVING, ale nie we wskazanym dworku. Trzeba dołączyć z powrotem do oryginalnej tabeli po użyciu 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

Łącze do symulacji skrzypiec SQL jest pomocne, dzięki – Yaaqov

1

Można to zrobić za pomocą prostego GROUP BY/zapytania o następujących parametrach:

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

ta odsyła konta, więc wynik jest inny niż podany. Jednym ze sposobów, aby uzyskać sprzedawców jest użycie listagg:

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

przeciwnym razie odpowiedź Gareth wraca wyniki sposób określony w pytaniu.