Oracle Group by NULL中的SQL返回多行

时间:2014-07-15 19:39:32

标签: sql oracle11g group-by crosstab

我有一个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中删除标记并选择并添加到计数中以识别类似行的多个标记。


谢谢!

4 个答案:

答案 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(*)返回每组中的行数。其中一个组是flagNULL值组合在一起。如果要计算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对此的帮助!