我正在尝试寻找今年的新销售量,这些销售量定义为我们今年销售给新客户而不是最后一位的客户,或者我们今年销售给现有客户但去年没有销售的新产品。
select sales1.Rep, sum(sales1.InvPrice) as newsales from sales sales1
where YEAR(sales1.InvDate)=YEAR(CURDATE()) and not exists (select 1
from sales sales2
where YEAR(sales2.InvDate)=YEAR(DATE_ADD(CURDATE(), INTERVAL -1, YEAR)) and
CONCAT(sales1.CustNo, sales1.Item)=CONCAT(sales2.CustNo, sales2.Item) limit 1)
group by sales1.Rep
该查询返回每个代表的销售额,但是要花费一个多小时才能运行。有没有更好的方法来编写此查询,以便它不会花费很长时间?从2017年1月1日到现在,我的销售表中大约有60万行。
最佳答案
您可以尝试执行此操作,但是索引是否正确。
如果不是,请从查询中发布EXPLAIN。
SELECT sales1.Rep
, sum(sales1.InvPrice) as newsales
FROM sales sales1
WHERE sales1.InvDate BETWEEN DATE_FORMAT(NOW(),'%Y-01-01 00:00:00') AND DATE_FORMAT(NOW(),'%Y-12-31 23:59:59')
AND NOT EXISTS (
SELECT 1 FROM sales sales2
WHERE sales2.InvDate BETWEEN DATE_FORMAT(NOW() - INTERVAL 1 YEAR '%Y-01-01 00:00:00')
AND DATE_FORMAT(NOW() - INTERVAL 1 YEAR,'%Y-12-31 23:59:59')
AND ( sales1.CustNo = sales2.CustNo AND sales1.Item = sales2.Item)
LIMIT 1)
GROUP BY sales1.Rep;