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

标签 mysql sql sum max

我试图理解为什么 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/

相关文章:

mysql - 在mysql中检索相同日期的行

php - 在 PHP 中组合 sql 查询

Mysql查询求和和减法求和表

sql - 每小时值总和

MySQl,无法从Java向表中插入数据

php - 如何在codeigniter中创建动态菜单

php - 从查询结果设置 session 变量

sql - 在 PL/SQL 中创建登录过程

mysql - 每个派生表必须有自己的别名 mysql 数据库

r - 基于 R 中的另一列对数据框中的列求和