首页 > 解决方案 > 在 mysql 中不允许使用 FETCH 子句。改用什么替代方法

问题描述

嗨,我有 2 个表想要使用聚合并有线索。你能检查我的查询吗?不工作

SELECT
    registration.Staff_ID,
    staff.FirstName,
    staff.LastName,
    (sum(registration.RegFeeAmntPaid)) AS The_Best_Seller
FROM registration,staff
WHERE registration.Staff_ID = staff.Staff_ID
GROUP BY Staff_ID
HAVING MAX(SUM(registration.RegFeeAmntPaid)) = SUM(registration.RegFeeAmntPaid);

标签: mysqlsqlaggregationhaving

解决方案


嵌套聚合 MAX(SUM(registration.RegFeeAmntPaid)) 问题是: SQL 中不允许嵌套聚合:第一次聚合后,只有一个值。因此,再次聚合没有意义。(在 Oracle 中,在 GROUP BY 查询的 SELECT 下,可以使用嵌套聚合来获取单个值,但这不是标准的。)

此外,在大多数系统中,在没有聚合的 SELECT 下打印的属性必须出现在 GROUP BY 下。(在标准 SQL 和 PostgreSQL 中,由 GROUP BY 属性在功能上确定的属性是可以的。但例如在 Oracle 中,它们必须在 GROUP BY 下明确提及,即使这实际上不会更改组。)

此外,在 GROUP BY 子句中,Staff_ID 缺少表/元组变量名称(不清楚,您的意思是registration.Staff_ID 还是staff.Staff_ID。我知道没关系,但SQL 系统不知道。 )

有几种解决方案可以使总和最大化。一个是这样的:

SELECT
    registration.Staff_ID,
    staff.FirstName,
    staff.LastName,
    (sum(registration.RegFeeAmntPaid)) AS The_Best_Seller
FROM registration,staff
WHERE registration.Staff_ID = staff.Staff_ID
GROUP BY registration.Staff_ID,
         staff.FirstName, staff.LastName
HAVING SUM(registration.RegFeeAmntPaid) >= ALL
    (SELECT SUM(s.RegFeeAmntPaid)
     FROM   registration s
     GROUP BY s.staff_id)

另一种解决方案是使用 WITH 子句定义一个包含每个 staff_id 总和的辅助表。然后你可以使用 MAX 函数。这在没有 WITH 子句的情况下也是可能的,但是需要在 FROM 下进行子查询(这也给出了一个中间表)。必须将这两个聚合放入不同的 SELECT 子句中。


推荐阅读