5

我有一个简单的问题:如何在 SQL(确切地说是 Oracle)中使用 Count(Distinct) 来仅返回给定字段中有两个或多个不同值的行。

这通过示例更容易理解:

ACCOUNT     SALESMAN
123         Abc
123         Abc

246         Abc
246         Def
246         Def

369         Hij

456         Abc
456         Def

在此示例中,具有 2 个不同销售代表的唯一帐户是 246 和 456,因此,我希望查询结果仅显示 2 个或更多销售人员共享的帐户:

ACCOUNT     SALESMAN
246         Abc
246         Def
456         Abc
456         Def

谢谢。

4

3 回答 3

9

使用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

这是一个演示

于 2012-09-21T16:12:53.237 回答
6

正如其他答案所示,您需要使用HAVING,但不在指定的庄园中使用。使用后需要加入原表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小提琴

于 2012-09-21T16:22:09.553 回答
1

您可以使用简单的 GROUP BY/HAVING 查询来做到这一点:

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

这将返回accounts,因此结果与您指定的不同。获得销售人员的一种方法是使用 listagg:

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

否则,Gareth 的答案会按照您在问题中指定的方式返回结果。

于 2012-09-21T16:30:43.200 回答