我有一个sql语句,它试图检索所有类似行的计数大于1的行。在所有这些行中,一个字段似乎保持空值。
案例1:
我们说表名是ABC
BUSINESS_UNIT,INVOICE,FLAG
A 1(空)
A 1(空)
SQL语句:通过BUSINESS_UNIT,INVOICE,FLAG从TABLE ABC组中选择BUSINESS_UNIT,INVOICE,FLAG,其COUNT(*)> 1
我希望它不返回任何行,因为两个标志基本上都是空白的。但它返回
BUSINESS_UNIT,INVOICE,FLAG
A 1(空)
案例2:
表ABC
BUSINESS_UNIT,INVOICE,FLAG
A 1(空)
A 1(空)
B 1 1
B 1(空)
SQL语句:通过BUSINESS_UNIT,INVOICE,FLAG从TABLE ABC组中选择BUSINESS_UNIT,INVOICE,FLAG,其COUNT(*)> 1
我期待结果是
BUSINESS_UNIT,INVOICE,FLAG
B 1 1
这适用于Oracle 11g。有人可以帮忙解决这个问题并告诉我们是否可以使用Oracle中提供的任何功能?
编辑原始sql语句后。
我实际上应该从Group by中删除标记并选择并添加到计数中以识别类似行的多个标记。
谢谢!
答案 0 :(得分:3)
嗯,null也是一个值,因此如果按可空字段分组,则空值将与非空值不同。
如果您不想使用null值,只需添加where子句
SELECT INVOICE
from TABLE ABC
where flag is not null
group by BUSINESS_UNIT, INVOICE, FLAG
having COUNT(*) >1
答案 1 :(得分:2)
这是您的第一个查询:
SELECT BUSINESS_UNIT, INVOICE, FLAG
from TABLE ABC
group by BUSINESS_UNIT, INVOICE, FLAG
having COUNT(*) > 1;
count(*)
返回每组中的行数。其中一个组是flag
,NULL
值组合在一起。如果要计算flag
的非NULL值,则可以使用:
SELECT BUSINESS_UNIT, INVOICE, FLAG
from TABLE ABC
group by BUSINESS_UNIT, INVOICE, FLAG
having COUNT(flag) > 1;
或者按照RaphaëlAlthaus的建议过滤。
您的第二个疑问是:
SELECT INVOICE
from TABLE ABC
group by BUSINESS_UNIT, INVOICE, FLAG
having COUNT(*) > 1;
当select
中只有一列时,您似乎神奇地希望输出中有三列。是的,如果您真的想要,group by
中的列可以多于select
中的列。
你的最后一个问题是:
有人可以帮忙解释一下,如果我们可以使用任何一个,请告诉我 Oracle中提供的功能?
当然可以。 Oracle有一套非常强大的功能。其中大多数都符合ANSI标准,并且在Oracle和其他数据库上的行为方式相同。您只需要学习如何正确使用它们。
答案 2 :(得分:0)
除了按照RaphaëlAlthaus的建议添加WHERE子句之外,您还可以将count(*)更改为count(flag):
SELECT INVOICE
from TABLE ABC
group by BUSINESS_UNIT, INVOICE, FLAG
having COUNT(flag) >1
答案 3 :(得分:0)
我想我已经找到了我想要找的东西。
SELECT BUSINESS_UNIT,INVOICE 来自TABLE ABC 由BUSINESS_UNIT,INVOICE组成 有COUNT(DISTINCT标志)> 1
案例1:它不返回任何行
案例2:返回1行
BUSINESS_UNIT,INVOICE
B 1
感谢Raphael,Dnoeth和Gordon对此的帮助!