【问题标题】:Returning data for the highest total in a group返回组中最高总数的数据
【发布时间】:2015-02-04 08:34:15
【问题描述】:

我有这些表:

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

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

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

【问题讨论】:

  • 您能否确认productorders 上,而不是在order details - 即details 表上,quantity 指的是什么,如果不是@987654327 @/item/product code?
  • 我怀疑您设置了重复帐户:stackoverflow.com/questions/27327810/…
  • @StuartLC,编辑了它,我希望它更清楚!
  • @MitchWheat 哈哈,这实际上是一个小组成员。我们都在一起做这个项目。
  • 你的意思是你们都'没有工作',而只是将问题发送给 SO!

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


【解决方案1】:

试试这个:

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;

【讨论】:

    【解决方案2】:

    您根本不需要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:

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

    注意事项:

    • 根据评论,产品 id 在 Orders 表上似乎很奇怪,sku / 商品代码通常在订单商品级别
    • 直接在客户表上建模服务员工 ID 不是一个好主意 - 回头客怎么办?一个新的ServingEmployeeCustomer 连接表按顺序响起。
    • 加入 CustomerName 也不是一个好主意 - 如果没有自然键,建议生成一个简单的代理键(INT 身份/自动编号,或 Guid 等)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 2023-03-15
      相关资源
      最近更新 更多