You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL计算近5个月佣金无结果,及获取最后订单日期前3个月需求

需求与代码修正

需求清单

  • 获取从最后订单日期起往前推3个月的时间范围
  • 计算销售代表最近5个月的总佣金

原代码问题分析

你的查询没有返回结果,核心原因有两点:

  1. LEFT JOIN 被强制转为 INNER JOIN:WHERE 子句中加入 c.order_date >= CURDATE()- INTERVAL 5 MONTH,会过滤掉所有没有符合条件订单的销售代表;如果最近5个月无任何订单,整个查询直接返回空。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:50:28