2016-07-31 43 views
0

我有SQL表(隨着越來越多列,但它並不重要)SQL COUNT(*)值

CREATE TABLE `test_results` (
`id` int AUTO_INCREMENT, 
`date_time` datetime, 
`altpn` varchar(60), 
`error1` int, 
`error2` int, 
`error3` int, 
PRIMARY KEY (`id`) 
); 

數據可以像:身份證,2016年6月16日14: 26:02,9513 400,590,0,0。

並在此表進出口運行該SQL查詢:

SELECT date(test_results.date_time) AS date, test_results.altpn as PN, COUNT(*) AS count 
FROM test_results 
WHERE (test_results.error1 = 1000 OR test_results.error1 = 1001 OR test_results.error2 = 1000 OR test_results.error2 = 1001 OR test_results.error3 = 1000 OR test_results.error3 = 1001) 
GROUP BY date(test_results.date_time), test_results.altpn 
ORDER BY date(test_results.date_time), test_results.altpn 

這工作不錯,但我還需要知道日期,當COUNT(*)爲零。我看到幾個關於LEFT JOIN的主題,但我無法修改代碼以使用此表。

+1

刪除SQL服務器的標籤。 –

回答

0

當您使用WHERE時,您將過濾其他錯誤代碼的行並且它們不能被計數。相反,選擇所有的行像往常一樣和LEFT JOIN到一個表,其中零行不存在:

SELECT * 
FROM test_results t1 
LEFT JOIN test_results t2 ON t2.id=t1.id 
    AND 
    (t2.error1 = 1000 OR t2.error1 = 1001 OR t2.error2 = 1000 
    OR t2.error2 = 1001 OR t2.error3 = 1000 OR t2.error3 = 1001) 

正如你看到的,結果集包括與其他錯誤的1000/1001錯誤,NULL值的行。現在,簡單組和指望他們:基於語法

SELECT date(t1.date_time) AS date, t1.altpn as PN, COUNT(t2.id) AS count 
FROM test_results t1 
LEFT JOIN test_results t2 ON t2.id=t1.id 
    AND 
    (t2.error1 = 1000 OR t2.error1 = 1001 OR t2.error2 = 1000 
    OR t2.error2 = 1001 OR t2.error3 = 1000 OR t2.error3 = 1001) 
GROUP BY date(t1.date_time), t1.altpn 
ORDER BY date(t1.date_time), t1.altpn 

http://sqlfiddle.com/#!9/9c6236/4

+0

感謝您的工作代碼,感謝您的解答:-)。 – fbituco