返回组中总数最高的数据

时间:2014-12-06 04:28:21

标签: sql select join group-by aggregate-functions

我有这些表格:

  • 客户,包括:帮助他们的员工的员工ID
  • 订单,包括:订单号,产品ID,发货日期,订购该商品的客户名称
  • orderdetails,包括订单号,数量,产品ID
  • 员工,包括名字,姓氏

如何显示销售数量最多的员工的姓氏和名字?

我知道我必须使用多个连接,别名和一些HAVING语句,但我不确定如何继续。

2 个答案:

答案 0 :(得分:0)

根本不需要HAVING。如您所建议的那样,加入连接键上的所有表,然后按两个员工名称列进行分组。

以下查询(带派生表)应该与任何RDBMS无关,但排除了将结果限制为仅一行的最终考虑因素,这取决于RDBMS

SELECT d.FirstName, d.LastName, d.TotalQuantity
FROM
(
    SELECT e.FirstName, e.LastName, SUM(od.Quantity) AS TotalQuantity
    FROM OrderDetails od 
    INNER JOIN Orders o ON OrderDetails.OrderId = o.OrderId
    INNER JOIN Customers c ON o.CustomerName = c.CustomerName -- Switch to a surrogate key
    INNER JOIN Employees e ON c.EmployeeId = e.EmployeeId 
    -- WHERE od.ProductId = `FooBars` -- If you need a filter
    GROUP BY e.FirstName, e.LastName
) d
ORDER BY d.TotalQuantity DESC;

对于“只是最高员工”的要求,您需要将行数限制为1,这取决于RDBMS:

  • 将最后一行更改为ORDER BY ... LIMIT 1; for MySql
  • 或将最后一行更改为ORDER BY ... FETCH FIRST 1 ROWS ONLY;以获取较新版本的SqlServer和Oracle
  • 或将旧版本的SqlServer
  • 的第一行更改为SELECT top 1 d.FirstName, ..

注意:

  • 根据评论,产品ID在Orders表上似乎很奇怪,sku / item代码通常位于订单商品级别
  • 直接在客户表上建立服务员工ID不是一个好主意 - 重复客户怎么样?新的ServingEmployeeCustomer联结表按顺序发出声音。
  • 加入CustomerName也不是一个好主意 - 如果没有自然键,建议生成一个简单的代理键(INT身份/自动号码或Guid等)

答案 1 :(得分:0)

试试这个:

SELECT e.FirstName, e.LastName, SUM(od.Quantity) AS Quantity
FROM OrderDetails od 
INNER JOIN Orders o ON od.OrderId = o.OrderId
INNER JOIN Customers c ON o.CustomerName = c.CustomerName 
INNER JOIN Employees e ON c.EmployeeId = e.EmployeeId 
GROUP BY e.FirstName, e.LastName
ORDER BY Quantity DESC;