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

sql - Why doesn't MAX() of SUM() work?

我想了解为什么 MAX(SUM(col)) 的 SQL 命令会出现语法错误。我有两个 tables 如下-:

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

人员Table

+--------+-------+----------+
| 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     |
+--------+-------+----------+

结果Table

基本上我有一个细节 table 和一个结果 table。我想找到 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 我确实得到了使用派生 tables 的正确答案。我通过使用以下查询得到我的答案-:

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() returns 只有一个值,所以 MAX() 发现计算一个值的值毫无意义,但我已经测试了以下查询 -:

select max(foo) from a;

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

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

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

尝试这样的事情:

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

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

反正不是很有感觉。假设 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)) 无效。

当 grouping/aggregating 函数(例如 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);

我没有运行这个。但是试试这个。希望它会起作用:)