2017-09-15 78 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月的条目,因此预计会出现空的结果集。