mysql - 查询以显示本年度的新销售增长
问题描述
我正在努力寻找今年的新销售额,定义为我们今年卖给但不是最后一次的新客户,或者我们今年卖给现有客户但去年没有卖的新产品。
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 行。
解决方案
你可以试试这个,但你有正确的索引。如果不是,请从查询中发布 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;
推荐阅读
- c# - 为 RX Stream / IObservable 添加一个初始值
- windows - "open | $filex" 无法仅在 Windows 上执行现有文件
- r - 从一个 DataFrame 到另一个 Data.Table 的操作
- javascript - 使用 .map 函数在反应中显示问卷答案的状态
- c++ - 使用 ncurses 而不安装它
- python - 在流式管道中组合多个侧面输入时,数据流失败
- javascript - 为什么在获取数据库的特定项目时我的 get 请求不起作用?
- r - 使用 R 中的匹配将列的子集乘以第二个数据框中的值
- python - 尝试扩展大量文件时,Snakemake 挂起
- ruby-on-rails - Rails,Javascript没有被推迟