gpt4 book ai didi

mysql - sql - 为什么 SUM() 的 MAX() 不起作用?

转载 作者:行者123 更新时间:2023-12-01 00:20:40 24 4
gpt4 key购买 nike

我试图理解为什么 MAX(SUM(col)) 的 SQL 命令给出语法错误。我有如下两个表-:

+--------+--------+---------+-------+
| pname | rollno | address | score |
+--------+--------+---------+-------+
| A | 1 | CCU | 1234 |
| B | 2 | CCU | 2134 |
| C | 3 | MMA | 4321 |
| D | 4 | MMA | 1122 |
| E | 5 | CCU | 1212 |
+--------+--------+---------+-------+

人事表

+--------+-------+----------+
| rollno | marks | sub |
+--------+-------+----------+
| 1 | 90 | SUB1 |
| 1 | 88 | SUB2 |
| 2 | 89 | SUB1 |
| 2 | 95 | SUB2 |
| 3 | 99 | SUB1 |
| 3 | 99 | SUB2 |
| 4 | 82 | SUB1 |
| 4 | 79 | SUB2 |
| 5 | 92 | SUB1 |
| 5 | 75 | SUB2 |
+--------+-------+----------+

结果表

基本上我有一个详细信息表和一个结果表。我想找到在 SUB1SUB2 组合中获得最高分的候选人的姓名和分数。基本上是总分最高的人。

我可以使用以下查询找到所有候选人的 SUB1SUB2 的总和:

select p.pname, sum(r.marks) from personel p, 
result r where p.rollno=r.rollno group by p.pname;

它给出以下输出:

+--------+--------------+
| pname | sum(r.marks) |
+--------+--------------+
| A | 178 |
| B | 167 |
| C | 184 |
| D | 198 |
| E | 161 |
+--------+--------------+

这很好,但我只需要输出 D | 198 因为他是最高得分手。 现在,当我像下面这样修改查询时,它会失败:

select p.pname, max(sum(r.marks)) from personel p, 
result r where p.rollno=r.rollno group by p.pname;

在 MySQL 中,我得到了 Invaild Group Function 的错误。

现在搜索 SO 我确实得到了使用派生表的正确答案。我通过使用以下查询得到我的答案:

SELECT 
pname, MAX(max_sum)
FROM
(SELECT
p.pname AS pname, SUM(r.marks) AS max_sum
FROM
personel p, result r
WHERE
p.rollno = r.rollno
GROUP BY p.pname) a;

但我的问题是为什么 MAX(SUM(col)) 不起作用?

我不明白为什么 max 不能计算 SUM() 返回的值。现在关于 SO 的回答表明,由于 SUM() 仅返回一个值,因此 MAX() 发现计算一个值的值毫无意义,但我已经测试了以下查询-:

select max(foo) from a;

表“a”只有一行,只有一列名为 foo,它包含一个整数值。那么,如果 MAX() 无法计算单个值,那么它是如何工作的?

有人可以向我解释查询处理器如何执行查询以及为什么我会收到无效组函数的错误吗?从可读性的角度来看,使用 MAX(SUM(col)) 是完美的,但并非如此。我想知道为什么。

MAXSUM 永远不能一起使用吗?我问是因为我看到了像 MAX(COUNT(col)) 这样的查询。我不明白它是如何工作的,而不是这个。

最佳答案

聚合函数需要一个参数来为组中的每一行提供一个值。其他聚合函数不会这样做。

反正也不是很有感觉。假设 MySQL 接受了 MAX(SUM(col))——这意味着什么?那么,SUM(col) 产生相关组中所有行的 col 列的所有非 NULL 值的总和,即一个数字。您可以将它的 MAX() 设为相同的数字,但这有什么意义呢?

您使用子查询的方法是不同的,至少在原则上是这样,因为它聚合了两次。您在其中执行 SUM() 的内部聚合会为 p.pname 的每个值计算单独的总和。然后外部查询计算子查询返回的所有行的最大值(因为您没有在外部查询中指定 GROUP BY)。如果这是您想要的,那就是您需要指定的方式。

关于mysql - sql - 为什么 SUM() 的 MAX() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29040466/

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