gpt4 book ai didi

MySQL - 如何加入两个子查询

转载 作者:可可西里 更新时间:2023-11-01 07:57:59 24 4
gpt4 key购买 nike

我正在尝试创建一个查询,它将为我提供:- 店名- 顶级销售员- 销售人员销售值(value)- 经理姓名

我已经设法创建了以下两个查询。这两个查询都有效,但我只需要帮助将它们连接在一起。

从每家商店获得顶级销售人员。

SELECT MAX(sales) FROM (SELECT shopid, SUM(amount) AS sales 
FROM fss_Payment GROUP BY empnin) AS salesdata GROUP BY shopid

获取所有经理及其商店

SELECT s.shopname, e.empname FROM fss_Shop s 
JOIN fss_Employee e ON e.shopid = s.shopid AND e.mgrnin=""
ORDER BY s.shopid

现在我需要连接两个查询的结果。我试着像下面那样做:

SELECT * FROM
(SELECT s.shopname, e.empname FROM fss_Shop s
JOIN fss_Employee e ON e.shopid = s.shopid AND e.mgrnin=""
) x
JOIN
(SELECT MAX(sales) FROM (SELECT shopid, SUM(amount) AS sales
FROM fss_Payment GROUP BY empnin) AS salesdata GROUP BY shopid
) y
ON x.shopid = y.shopid

通过此链接查看我的一些表格的外观 - https://www.db-fiddle.com/f/t94XmTEMgXpmSLS3e8HWAh/1

最佳答案

更新

MySQL 8.0 引入窗口函数

https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

下面原答案对MySQL 8.0之前的版本仍然适用。


原始答案

我们认为这会是一件简单的事情。一些数据库为我们提供了分析/窗口功能,这使得这相当容易。在 MySQL 中,我们有两种选择:使用直接的 SQL 方法,或使用一些用户定义的变量来模拟分析函数。

对于直接的 SQL 方法,我们可以一次构建一个查询。

首先,我们可以获得每个商店每个销售人员的总销售额

  SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_Payment p
GROUP
BY p.shopid
, p.empnin
ORDER
BY p.shopid ASC
, SUM(p.amount) DESC

查看结果并验证这是正确的。然后我们可以将该查询用作另一个查询中的内联 View ,以获得每个商店的“最高”总销售额:

  -- get highest total sales for each store
SELECT q.shopid
, MAX(q.sales) AS highest_sales
FROM ( SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_payment p
GROUP
BY p.shopid
, p.empnin
) q
GROUP
BY q.shopid
ORDER
BY q.shopid

我们可以获取该结果,并将其加入到每个销售人员/商店的总销售额中,以获得与该商店匹配的“最高”销售额的销售人员

  -- get salesperson with the highest total sales for each store
SELECT t.shopid
, t.empnin
, t.sales
FROM ( SELECT q.shopid
, MAX(q.sales) AS highest_sales
FROM ( SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_payment p
GROUP
BY p.shopid
, p.empnin
) q
GROUP
BY q.shopid
) r
JOIN ( SELECT s.shopid
, s.empnin
, SUM(s.amount) AS sales
FROM fss_payment s
GROUP
BY s.shopid
, s.empnin
) t
ON t.shopid = r.shopid
AND t.sales = r.highest_sales

如果有两个(或更多)empnin 具有相同的最高总销售额(并列第一),则此查询将返回这两个(或所有)销售人员。

现在我们只需要添加一个连接到 fss_shop 以获取 storename,并添加几个连接到 fss_employee 以获取销售人员姓名,并得到那个销售员的经理

将此添加到查询中,

   JOIN fss_shop h 
ON h.shopid = t.shopid
LEFT
JOIN fss_employee e
ON e.empnin = t.empnin
LEFT
JOIN fss_employee m
ON m.empnin = e.mgrnin

添加一个order by子句

  ORDER BY h.storename, e.empname

并将适当的表达式添加到 SELECT 列表中。

把所有这些放在一起,我们得到这样的东西:

  SELECT h.shopname       AS `storename` 
, e.empname AS `top salesperson`
, t.sales AS `salesperson sales value`
, m.empname AS `manager name`
FROM ( SELECT q.shopid
, MAX(q.sales) AS highest_sales
FROM ( SELECT p.shopid
, p.empnin
, SUM(p.amount) AS sales
FROM fss_payment p
GROUP
BY p.shopid
, p.empnin
) q
GROUP
BY q.shopid
) r
JOIN ( SELECT s.shopid
, s.empnin
, SUM(s.amount) AS sales
FROM fss_payment s
GROUP
BY s.shopid
, s.empnin
) t
ON t.shopid = r.shopid
AND t.sales = r.highest_sales
JOIN fss_shop h
ON h.shopid = t.shopid
LEFT
JOIN fss_employee e
ON e.empnin = t.empnin
LEFT
JOIN fss_employee m
ON m.empnin = e.mgrnin
ORDER BY h.storename, e.empname

要回答您提出的问题,如何将这两个查询连接在一起以获得指定的结果:我认为这两个查询不可能。


返回的 经理姓名 是员工的经理。如果我们想要获得商店的经理,请将 m 的连接条件更改为匹配 h 而不是 e

我提到的另一种方法是使用用户定义的变量。通过这种方法,每个商店只获得一名“顶级销售人员”会更容易(当规范规定始终存在“决胜局”时。顶级销售人员没有任何关系。)

使用用户定义的变量,我们可能会在处理大型数据集时获得更好的性能。但该方法还依赖于保证的行为,如 MySQL 引用手册中所述。

关于MySQL - 如何加入两个子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47561248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com