返回组中最高总数的数据
Posted
技术标签:
【中文标题】返回组中最高总数的数据【英文标题】:Returning data for the highest total in a group 【发布时间】:2015-02-04 08:34:15 【问题描述】:我有这些表:
客户,其中包括:帮助他们的员工的员工 ID 订单,其中包括:订单号、产品 ID、发货日期、订购该商品的客户名称 orderdetails,包括订单号、数量、产品 ID 员工,包括名字、姓氏如何显示销售产品数量最多的员工的姓氏和名字?
我知道我必须使用多个连接、别名和一些 HAVING 语句,但我不确定如何继续。
【问题讨论】:
您能否确认product
在orders
上,而不是在order details
- 即details
表上,quantity
指的是什么,如果不是@987654327 @/item
/product code
?
我怀疑您设置了重复帐户:***.com/questions/27327810/…
@StuartLC,编辑了它,我希望它更清楚!
@MitchWheat 哈哈,这实际上是一个小组成员。我们都在一起做这个项目。
你的意思是你们都'没有工作',而只是将问题发送给 SO!
【参考方案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 等)
【讨论】:
以上是关于返回组中最高总数的数据的主要内容,如果未能解决你的问题,请参考以下文章