[英]sql - Why doesn't MAX() of SUM() work?
我试图理解为什么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
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
)。 如果这就是你想要的,那就是你需要指定它的方式。
尝试这样的事情:
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
错误是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
。 这就是为什么您需要将查询作为单独的步骤进行。
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);
我没有运行这个。 但是试试这个。 希望它会起作用:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.