【发布时间】:2021-10-18 12:13:38
【问题描述】:
我正在使用https://www.w3schools.com/mysql/trymysql.asp?filename=trysql_func_mysql_concat 练习 MYSQL,它有一个模拟数据库供我练习,我正在尝试使用 GROUP BY 命令我正在尝试将所有员工与他们的所有销售额分组并确定他们的姓名、他们的销售额和他们卖得最多的产品。我设法获得了他们的名称和销售额,但没有获得产品名称。我知道用 group by 提取信息很困难,我尝试过使用子查询。有没有办法获取信息。 我的查询如下。
SELECT
CONCAT_WS(' ',
Employees.FirstName,
Employees.LastName) AS 'Employee name',
COUNT(*) AS 'Num of sales'
FROM
Orders
INNER JOIN
Employees ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN
OrderDetails ON OrderDetails.OrderID = Orders.OrderID
INNER JOIN
Products ON Products.ProductID = OrderDetails.ProductID
GROUP BY Orders.EmployeeID
ORDER BY COUNT(*) DESC;
这里的意思是获取订单,根据订单employeeid加入员工,根据订单id加入订单明细,在订单明细中根据产品id加入产品信息,然后按员工id分组并按顺序排序员工的销售额。
SELECT
concat_ws(' ',
Employees.FirstName,
Employees.LastName) as 'Employee name',
count(*) as 'Num of sales',
(
SELECT Products.ProductName
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN OrderDetails ON OrderDetails.OrderID = Orders.OrderID
INNER JOIN Products ON Products.ProductID = OrderDetails.ProductID
GROUP BY Orders.EmployeeID
ORDER BY count(Products.ProductName) desc
LIMIT 1
) as 'Product Name'
FROM Orders
INNER JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID
INNER JOIN OrderDetails ON OrderDetails.OrderID = Orders.OrderID
INNER JOIN Products ON Products.ProductID = OrderDetails.ProductID
GROUP BY Orders.EmployeeID
ORDER BY count(*) desc;
以上是我尝试对解决方案使用子查询。
【问题讨论】:
-
你遇到困难的原因是这是困难 :-) 你认为“一切都在那里,员工、他们的订单、订购的产品;所以为什么我不能轻易找到最畅销的产品吗?”。这是因为 MySQL 缺少一个聚合函数。您正在寻找的称为统计模式,例如 Oralce 有一个函数
STATS_MODE用于此。但 MySQL 没有。 -
解决此问题的一种方法是在 select 子句的子查询中再次选择所有这些内容,然后按产品计数降序排列,并使用
LIMIT获取第一行。 -
我确实尝试了子查询,但我只得到了相同的产品名称,我认为这是因为我的查询有缺陷并且正在选择任何产品名称或正在为一个选择最受欢迎的产品员工,然后将其显示给所有员工。
-
我添加了我对使用子查询的解决方案的尝试。
-
我已经发布了一个答案 :-) 附带说明:单引号分隔字符串文字。对于别名,您应该改用双引号。在某些情况下,当混淆两者时,您可能会得到意想不到的结果。对于别名,我会使用无论如何都不必引用的名称(employee_name、num_of_sales、...)。
标签: mysql sql select group-by aggregate