[英]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.