我试图理解为什么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))
这样的查询。我不明白这是如何运作的,而不是这个。
答案 0 :(得分:4)
聚合函数需要一个参数,该参数为组中的每一行提供值。其他综合功能不会这样做。
反正它并不是很有感觉。假设MySQL接受MAX(SUM(col))
- 它意味着什么?好吧,SUM(col)
会在相关组中的所有行上生成列NULL
的所有非col
值的总和,这是一个数字。您可以将MAX()
取为相同的数字,但重点是什么?
使用子查询的方法至少在原则上是不同的,因为它聚合了两次。执行SUM()
的内部聚合为p.pname
的每个值计算单独的总和。然后外部查询计算子查询返回的所有行的最大值(因为您没有在外部查询中指定GROUP BY
)。如果这就是您想要的,那就是您需要如何指定它。
答案 1 :(得分:1)
尝试这样的事情:
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
答案 2 :(得分:1)
错误为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
。这就是您需要将查询作为单独步骤进行的原因。
答案 3 :(得分:0)
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);
我没有这样做。但试试这个。希望它能起作用:))