当使用WHERE时,如何在COUNT中包含“零”/“0”结果?

时间:2016-12-09 11:08:01

标签: mysql

我正在尝试查询将返回0 COUNT以及我的新员工的月和月之间的销售总数。

SELECT recruits.pin, recruits.first_name, recruits.surname, sales.sale_date,
COUNT(sales.pin) AS 'TotalSales' FROM sales
 LEFT JOIN recruits ON sales.pin = recruits.pin
WHERE sales.sale_date BETWEEN '$sYear1-$sMonth1-01' AND '$sYear2-$sMonth2-31'
AND recruits.country = '$sCountry'
GROUP BY recruits.pin
ORDER BY COUNT(sales.pin) DESC;

这仅输出所选月份的总销售额。并且不显示任何0值,并且不会显示所有新兵。 如果我删除了WHERE语句,它会输出所有新兵,除非它没有按月过滤,所以我无法按月过滤掉销售数量。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这是因为我会说的where子句。您还应该反转销售和招聘。首先招募所有新员工然后加入销售。尝试通过测试sales.id(选择正确的列名称)是否为空或者销售是否在期间来包括所有新员工。

SELECT recruits.pin, recruits.first_name, recruits.surname, sales.sale_date,
SUM(COALESCE(sales.Total,0)) AS 'TotalSales' FROM recruits
LEFT OUTER JOIN sales ON sales.pin = recruits.pin
WHERE sales.pin IS NULL OR sales.sale_date BETWEEN '$sYear1-$sMonth1-01' AND '$sYear2-$sMonth2-31'
AND recruits.country = '$sCountry'
GROUP BY recruits.pin
ORDER BY COUNT(sales.pin) DESC;

答案 1 :(得分:0)

您需要将recruits上的条件移至on子句。但是,如果您想要所有新兵(按国家/地区筛选),那么recruits应该是LEFT JOIN中的第一个表。

我会把它写成:

SELECT r.pin, r.first_name, r.surname, s.sale_date,
       COUNT(s.pin) AS TotalSales
FROM recruits r LEFT JOIN
     sales s
     ON s.pin = r.pin AND
        s.sale_date BETWEEN '$sYear1-$sMonth1-01' AND '$sYear2-$sMonth2-31'
WHERE r.country = '$sCountry'
GROUP BY r.pin
ORDER BY COUNT(s.pin) DESC;

注意:

  • 表别名使查询更易于阅读和编写。
  • 通常,您希望在GROUP BY中包含所有未加聚合的列。据推测,pinrecruits中的主键/唯一键,因此这是一个不包括列的情况。
  • sale_date(第二个表)上的条件应该放在on条款中。
  • country(第一个表)上的条件应该放在where条款中。