我试图理解为什么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 |
+--------+-------+----------+
结果表
本质上,我有一个详细信息表和一个结果表。我想找到在SUB1
和SUB2
组合中获得最高分的候选人的姓名和标记。基本上是总分最高的人。
我可以使用以下查询找到所有候选人的SUB1
和SUB2
的总和-:
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))是完美的,但它不是那样工作的。我想知道为什么。
MAX
和SUM
永远不能一起使用吗?我问是因为我见过像MAX(COUNT(col))
这样的查询。我不明白这是如何工作的,而不是这个。
聚合函数需要一个参数,该参数为组中的每一行提供一个值。 其他聚合函数不这样做。
反正也不是很明智。 假设MySQL接受了MAX(SUM(col))
- 这意味着什么? 好吧,SUM(col)
产生相关组中所有行上列 col
的所有非NULL
值的总和,这是一个数字。 你可以把它MAX()
当作相同的数字,但有什么意义呢?
至少在原则上,使用子查询的方法有所不同,因为它聚合了两次。 执行SUM()
的内部聚合会为每个值计算一个单独的总和 p.pname
。 然后,外部查询计算子查询返回的所有行的最大值(因为您没有在外部查询中指定GROUP BY
)。 如果这是您想要的,那就是您需要指定它的方式。
错误为 1111: invalid use of group function
。至于为什么MySQL会有这个问题,我真的只能说它是底层引擎本身的一部分。 SELECT MAX(2)
确实有效(尽管缺乏GROUP BY
),但SELECT MAX(SUM(2))
不起作用。
当分组/聚合函数(如 MAX
)在错误的位置(如WHERE
子句)使用时,将发生此错误。 SELECT SUM(MAX(2))
也不起作用。
您可以想象MySQL尝试同时聚合两者,而不是按操作顺序执行操作,即它不会先SUM
然后获取MAX
。这就是您需要将查询作为单独步骤执行的原因。
尝试这样的事情:
select max(rs.marksums) maxsum from
(
select p.pname, sum(r.marks) marksums from personel p,
result r where p.rollno=r.rollno group by p.pname
) rs
with temp_table (name, max_marks) as
(select name, sum(marks) from personel p,result r, where p.rollno = r.rollno group by p.name)
select *from temp_table where max_marks = (select max(max_marks) from temp_table);
我没有运行这个。但是试试这个。希望它能:)工作