首页 > 解决方案 > 查询以显示本年度的新销售增长

问题描述

我正在努力寻找今年的新销售额,定义为我们今年卖给但不是最后一次的新客户,或者我们今年卖给现有客户但去年没有卖的新产品。

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 日到现在,我的销售表中有大约 600,000 行。

标签: mysql

解决方案


你可以试试这个,但你有正确的索引。如果不是,请从查询中发布 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;

推荐阅读