SQL:Null列上的计数不正确

时间:2019-01-11 13:19:03

标签: mysql sql

对于具有null值和非null值的记录,MySQL SQL不会返回正确的计数

我在具有三列(代码,amt,名称)的表中具有以下值

"AMPF";"0.1000";"Amplify Inc";
"AMPF";"0.1000";"Amplify Inc";
"AMPF";"0.2000";"Amplify Inc";
"AMPF";"0.2000";"Amplify Inc";
"AMPF";"0.3000";"Amplify Inc";
"AMPF";"0.3000";"";
"AMPF";"0.4000";"";
"XYZA";"0.1000";"PeterPal Inc";
"XYZA";"0.1000";"PeterPal Inc"

我正在运行以下查询,以获取针对特定项目代码存在的记录数。 SELECT代码,名称,count(amt)作为cnt从表组按代码顺序由cnt desc限制30

SELECT code, name, count(amt) as cnt FROM table group by code order by cnt desc limit 30

理想情况下,预期结果应该是:

AMPF,Amplify Inc,7
XYZA,PeterPal Inc,2

但是,结果是:

AMPF,Amplify Inc,5
XYZA,PeterPal Inc,2

它表示尽管我对amt列进行计数,但还是以某种方式将其记录在名称列中,该列在记录号6和7中为空。 对我的代码出了什么问题有任何想法吗?

2 个答案:

答案 0 :(得分:0)

首先,只需使用count(*)

SELECT code, MAX(name) as name, count(*) as cnt
FROM table 
GROUP BY code 
ORDER BY cnt desc 
LIMIT 30;

正在发生的事情是,看起来像'AMPF'的值不是真正的'AMPF',即它们不相等。我不知道为什么它可以是代码开头的空格,可以是不同字符集中的“外观相似”字符,也可以是隐藏字符。

如果您在列表的下方查找,您应该会看到其他代码也在计算中-如果您省略了LIMIT

我还更改了SELECT,因此NAME并非取自不确定的行。这只是使用找到的MAX()值。

答案 1 :(得分:0)

不幸的是,这种情况没有简单的答案。根据设计,MySQL count()函数实际上仅计算NOT NULL值。但是,可以实施以下两种解决方法:

首先,可以运行一个单独的SQL语句来计算NULL记录。

第二,如果通过外键在另一个表中有一个(或多个)期望值,请从另一个表中获取这些值,然后对第一个表进行计数以获得正确的计数。

PS:我用第一个来满足自己的需求。