SQL技术问询:如何找出2012年业绩最佳的员工
解决2012年业绩最佳员工的SQL查询方案
核心思路
要解决这个问题,需要完成三个关键步骤:正确关联三张表、过滤2012年的交易数据、计算员工销售总额并找出最大值。
基础查询(单一名次员工)
以下是最直接的SQL语句,适用于只需要获取第一名员工的场景:
SELECT e.FirstName || ' ' || e.LastName AS EmployeeName, SUM(i.Total) AS TotalSales2012 FROM Employee e JOIN Customer c ON e.EmployeeID = c.SupportRepID JOIN Invoice i ON c.CustomerID = i.CustomerID -- 过滤2012年的发票,两种方式选其一 WHERE YEAR(i.InvoiceDate) = 2012 -- 或者用日期范围(性能更优,适合有索引的情况) -- WHERE i.InvoiceDate BETWEEN '2012-01-01' AND '2012-12-31 23:59:59' GROUP BY e.EmployeeID, e.FirstName, e.LastName ORDER BY TotalSales2012 DESC LIMIT 1;
关键部分解释
- 表关联:使用
JOIN(即INNER JOIN)连接三张表,确保只统计有客户关联且产生过发票的员工,避免无业绩的员工被纳入。关联条件严格按照你提供的逻辑:Employee.EmployeeID = Customer.SupportRepID、Customer.CustomerID = Invoice.CustomerID。 - 时间过滤:
YEAR(i.InvoiceDate) = 2012:直接提取发票日期的年份进行过滤,写法简单。- 日期范围写法:
i.InvoiceDate BETWEEN '2012-01-01' AND '2012-12-31 23:59:59',如果InvoiceDate字段有索引,这种方式能利用索引提升查询效率。
- 分组与聚合:按员工的唯一标识
EmployeeID和姓名分组,用SUM(i.Total)计算每个员工的2012年销售总额。 - 排序取最大值:通过
ORDER BY TotalSales2012 DESC将销售额从高到低排序,LIMIT 1只取排名第一的员工。
处理并列第一名的情况
如果存在多个员工销售额并列最高,上面的查询只会返回其中一个。可以用CTE(公共表表达式)来获取所有并列第一的员工:
WITH EmployeeSales AS ( SELECT e.FirstName || ' ' || e.LastName AS EmployeeName, SUM(i.Total) AS TotalSales2012 FROM Employee e JOIN Customer c ON e.EmployeeID = c.SupportRepID JOIN Invoice i ON c.CustomerID = i.CustomerID WHERE i.InvoiceDate >= '2012-01-01' AND i.InvoiceDate < '2013-01-01' GROUP BY e.EmployeeID, e.FirstName, e.LastName ) SELECT EmployeeName, TotalSales2012 FROM EmployeeSales WHERE TotalSales2012 = (SELECT MAX(TotalSales2012) FROM EmployeeSales);
常见问题排查
你之前关联失败可能的原因:
- 关联条件写错:比如误将
Employee.EmployeeID和Customer.CustomerID关联,而非SupportRepID。 - 使用了错误的连接类型:比如用
LEFT JOIN导致包含了无客户的员工,但这类员工不会有业绩,反而干扰结果。
内容的提问来源于stack exchange,提问作者Carlos Mendez
相关产品推荐
相关产品推荐

