簡體   English   中英

SQL:Null列上的計數不正確

[英]SQL: Incorrect count on Null column

MySQL SQL沒有為具有null和非null值的記錄返回正確的計數

我在具有三列(代碼,代碼,名稱)的表中具有以下值

"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中為空。

首先,只需使用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()值。

不幸的是,這種情況沒有簡單的答案。 根據設計,MySQL count()函數實際上僅計算NOT NULL值。 但是,可以實施以下兩種解決方法:

首先,可以運行一個單獨的SQL語句來計算NULL記錄。

其次,如果一個(或多個)期望值通過外鍵在另一個表中可用,請從另一個表中獲取這些值,然后對第一個表進行計數以獲得正確的計數。

PS:我用第一個來滿足自己的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM