我正在尝试查询将返回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语句,它会输出所有新兵,除非它没有按月过滤,所以我无法按月过滤掉销售数量。
非常感谢任何帮助。
答案 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
中包含所有未加聚合的列。据推测,pin
是recruits
中的主键/唯一键,因此这是一个不包括列的情况。sale_date
(第二个表)上的条件应该放在on
条款中。country
(第一个表)上的条件应该放在where
条款中。