【问题标题】:using FETCH clause is not allowed in mysql .what alternative to be used instead在 mysql 中不允许使用 FETCH 子句。改用什么替代方法
【发布时间】:2021-12-20 06:41:37
【问题描述】:

您好,我有 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);

【问题讨论】:

  • 你不能这样嵌套聚合。
  • 这必须是两个设置:获取每个员工的总和。然后得到最大人员总和并进行比较。您正在尝试将这两个步骤合二为一。窗口函数将对此有所帮助。您使用的是什么 DBMS? (SQL 请求应始终使用 DBMS 进行标记,以免得到不适合您的答案。)
  • 我已经为你添加了 MySQL 标签。在标准 SQL 中,您可以将 HAVING 子句替换为 ORDER BY RANK() OVER (ORDER BY SUM(registration.RegFeeAmntPaid) DESC) FETCH FIRST ROW WITH TIES,但 MySQL 不支持 FETCH 子句。从 MySQL 8 开始,您可以使用 RANK OVERMAX OVER,但您需要一个子查询来评估结果。

标签: mysql sql aggregation having


【解决方案1】:

嵌套聚合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 子句中。

【讨论】:

  • 这很好解释。可能有更好的方法,但这取决于 DBMS。 @eli:你用的是哪个?
  • @ThorstenKettner ,谢谢我通过 localhost 使用 mysql、phpmyadmin、xamp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2014-08-31
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多