2017-09-15 106 views
1

在下面的查詢我要永遠顯示行即使SUM結果爲0濾鏡通過

沒有正常工作的WHERE子句,但是當我想在日期之間過濾,不會返回任何結果。什麼細節失敗?

SELECT tc.cars, 
COALESCE(SUM(ts.sales),0) AS cars_sales 
FROM tbl_cars tc 
LEFT JOIN tbl_sales ts ON tc.id_cars = ts.id_cars 
WHERE tc.recDate BETWEEN '2017-04-01' AND DATE_ADD('2017-05-01' , INTERVAL 1 DAY) 
GROUP BY tc.cars 
ORDER BY tc.cars; 

SQLFiddle:http://www.sqlfiddle.com/#!9/425e6d/1/0

+0

四月到五月間你沒有車。 http://www.sqlfiddle.com/#!9/425e6d/11 – chris85

+0

@ chris85,「即使SUM結果爲0,我也要始終顯示行」。 – ishegg

+0

...或者即使沒有行返回應該有'0'? – chris85

回答

1

把情況在JOIN代替。另外,我認爲你的意思是COUNT()這些字段,因爲ts.salesVARCHAR在你的模式中,而且在你的示例數據中也是空的。

SELECT 
    tc.cars, COALESCE(COUNT(ts.sales), 0) AS cars_sales 
FROM 
    tbl_cars tc 
     LEFT JOIN 
    tbl_sales ts ON tc.id_cars = ts.id_cars 
     AND tc.recDate BETWEEN '2010-04-01' AND DATE_ADD('2020-05-01', INTERVAL 1 DAY) 
GROUP BY tc.cars 
ORDER BY tc.cars; 

Fiddle

+1

@ ishegg和Yusuf謝謝。在我的查詢中(比我的例子更復雜),我剛開始構建查詢作爲您的建議,出於某種原因,我沒有發現它沒有奏效。您的解決方案讓我走上了正確的道路。我的查詢有幾個LEFT JOIN,我的AND ... BETWEEN子句在錯誤的JOIN中。現在它工作正常。再次感謝 – josei

2

使用這個代替:

SELECT tc.cars, 
COALESCE(SUM(ts.sales),0) AS cars_sales 
FROM tbl_cars tc 
LEFT JOIN tbl_sales ts ON tc.id_cars = ts.id_cars 
and tc.recDate BETWEEN '2017-04-01' AND DATE_ADD('2017-05-01' , INTERVAL 1 DAY) 
GROUP BY tc.cars 
ORDER BY tc.cars; 

join已被執行之後,where子句將篩選基於條件的整個數據集where子句中提供。由於您的數據集沒有4月和5月的條目,因此預計會出現空的結果集。