2012-09-21 8 views
5

Tôi có một câu hỏi đơn giản: Làm cách nào tôi có thể sử dụng Đếm (Khác biệt) trong SQL (Oracle chính xác) để chỉ trả về các hàng có hai hoặc nhiều giá trị khác nhau trong một trường nhất định.Sử dụng tính riêng biệt để tìm các bản ghi có 2 hoặc nhiều giá trị khác nhau trong một trường

này được dễ dàng hơn hiểu bằng ví dụ:

ACCOUNT  SALESMAN 
123   Abc 
123   Abc 

246   Abc 
246   Def 
246   Def 

369   Hij 

456   Abc 
456   Def 

Trong ví dụ này, các tài khoản chỉ với 2 reps bán hàng khác nhau sẽ là 246 và 456, và do đó, tôi muốn kết quả của truy vấn để chỉ hiển thị các tài khoản được chia sẻ bởi 2 hoặc nhiều nhân viên bán hàng:

ACCOUNT  SALESMAN 
246   Abc 
246   Def 
456   Abc 
456   Def 

Cảm ơn.

+0

bản sao có thể có của [người dùng chọn có nhiều hơn một bản ghi riêng biệt trong mysql] (http://stackoverflow.com/questions/15237740/select-users-have-more-than-one-distinct-records-in-mysql) – Bulat

Trả lời

7

sử dụng 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 

Đây là một demonstration.

+1

Điều này không đúng! Nếu bạn đang nhóm theo nhân viên bán hàng 'đếm (người bán hàng riêng biệt)' sẽ luôn là 1, do đó truy vấn này sẽ ** không bao giờ ** trả về bất kỳ kết quả nào. [Ví dụ về SQL Fiddle] (http://sqlfiddle.com/#!4/0e047/1) – GarethD

+1

Bạn nói đúng. Tôi sẽ sửa chữa nó –

+0

Cảm ơn giải pháp – Yaaqov

5

Khi câu trả lời khác cho biết bạn cần sử dụng HAVING, nhưng không phải trong trang viên được chỉ định. Bạn cần tham gia trở lại bảng ban đầu sau khi sử dụng 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

Liên kết tới mô phỏng SQL Fiddle hữu ích, cảm ơn – Yaaqov

1

Bạn có thể làm điều này với một GROUP đơn giản DO/CÓ truy vấn:

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

này trả về tài khoản, do đó kết quả khác với những gì bạn chỉ định. Một cách để nhân viên bán hàng sử dụng listagg:

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

Nếu không, câu trả lời của Gareth trả về kết quả theo cách bạn đã chỉ định trong câu hỏi.