oracle 使用 count distinct 查找字段中具有 2 个或更多不同值的记录
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12534177/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using count distinct to find records with 2 or more different values in a field
提问by Yaaqov
I have a simple question: How can I use Count(Distinct) in SQL (Oracle to be exact) to return only the rows where there are two or more different values in a given field.
我有一个简单的问题:如何在 SQL(准确地说是 Oracle)中使用 Count(Distinct) 来仅返回给定字段中有两个或多个不同值的行。
This is easier understood by example:
这通过示例更容易理解:
ACCOUNT SALESMAN
123 Abc
123 Abc
246 Abc
246 Def
246 Def
369 Hij
456 Abc
456 Def
In this example, the only Accounts with 2 differentsales reps would be 246 and 456, and thus, I'd want the query's result to just show the the accounts shared by 2 or more salesmen:
在这个例子中,只有 2 个不同销售代表的客户是 246 和 456,因此,我希望查询的结果只显示由 2 个或更多销售员共享的客户:
ACCOUNT SALESMAN
246 Abc
246 Def
456 Abc
456 Def
Thanks.
谢谢。
回答by Grisha Weintraub
use having:
使用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
Here is a demonstration.
这是一个演示。
回答by GarethD
As the other answer has indicated you need to use HAVING, but not in the manor indicated. You need to join back to the original table after using HAVING
正如另一个答案表明您需要使用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
回答by Gordon Linoff
You can do this with a simple GROUP BY/HAVING query:
你可以用一个简单的 GROUP BY/HAVING 查询来做到这一点:
select account
from t
group by account
having count(distinct salesperson) > 1
This returns the accounts, so the result is different from what you specify. One way to get the sales people is to use listagg:
这将返回帐户,因此结果与您指定的不同。获取销售人员的一种方法是使用 listagg:
select account, listagg(salesperson, ',')
from t
group by account
having count(distinct salesperson) > 1
Otherwise, Gareth's answer returns the results the way you specified in the question.
否则,Gareth 的回答会按照您在问题中指定的方式返回结果。

