mysql - 在 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);
解决方案
嵌套聚合 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 子句中。
推荐阅读
- python - 如何选择合适的谷歌风格迁移模型?
- bash - 如何将 git log --pretty=format:%aN,%ae 转换为特定格式?
- r - 如何用 mapply R 函数填充矩阵?
- python - 即使使用 Selenium,我们也可以禁止 IP 吗?
- sql - 根据某些字段比较两行并在发现差异时标记它们
- java - 在java中使用绝对路径打开文件
- php - 安装apache2.4和PHP7.2.29后Apache无法解析PHP
- reactjs - 渲染 React.Suspense 子节点后测量 DOM
- python - 芹菜将并行任务链接成和弦
- c# - 关于使用 Selenium C# 启动 Chromium 浏览器