MySQL计算近5个月佣金无结果,及获取最后订单日期前3个月需求
需求与代码修正
需求清单
- 获取从最后订单日期起往前推3个月的时间范围
- 计算销售代表最近5个月的总佣金
原代码问题分析
你的查询没有返回结果,核心原因有两点:
- LEFT JOIN 被强制转为 INNER JOIN:WHERE 子句中加入
c.order_date >= CURDATE()- INTERVAL 5 MONTH,会过滤掉所有没有符合条件订单的销售代表;如果最近5个月无任何订单,整个查询直接返回空。 - GROUP BY 不符合规范:SELECT 中包含
YEAR(c.order_date),但 GROUP BY 仅按姓名分组——在 MySQL 严格模式下会直接报错,即使非严格模式,返回的年份值也不可靠。
解决方案代码
1. 获取最后订单日期往前推3个月的时间范围
-- 查询最后订单日期及对应的3个月前起始日期 SELECT MAX(order_date) AS last_order_date, DATE_SUB(MAX(order_date), INTERVAL 3 MONTH) AS 3month_range_start FROM orders;
2. 修正后的最近5个月佣金计算
SELECT CONCAT(a.first_name, " ", a.last_name) AS sales_reps, -- 若需展示订单年份,用MAX()确保每个销售仅返回一个有效年份 MAX(YEAR(c.order_date)) AS order_year, -- 用COALESCE确保无订单的销售佣金显示为0 ROUND(COALESCE(SUM((d.quantity_ordered * d.price_each) * 0.01), 0), 2) AS commission_last_5mos FROM employees a LEFT JOIN customers b ON b.sales_rep_employee_no = a.employee_no -- 将日期条件移至orders表的JOIN条件中,保留LEFT JOIN特性(显示所有销售代表) LEFT JOIN orders c ON b.customer_no = c.customer_no AND c.order_date >= DATE_SUB(CURDATE(), INTERVAL 5 MONTH) LEFT JOIN order_details d ON c.order_no = d.order_no WHERE a.job_title = 'Sales Rep' -- 用employee_no分组更可靠,避免同名销售代表的分组错误 GROUP BY a.employee_no, CONCAT(a.first_name, " ", a.last_name) ORDER BY commission_last_5mos DESC LIMIT 1;
内容的提问来源于stack exchange,提问作者Joseph Badana Rivera
相关产品推荐
相关产品推荐

