当前位置: 首页 > 知识库问答 >
问题:

为什么我们需要使用聚合函数进行分组?

缑高朗
2023-03-14

我看到一个例子,其中有一个员工列表(表格)和他们各自的月薪。我查了一下工资,在工资中看到了完全相同的表格。这很奇怪。

这是必须要做的事情——我们必须弄清楚这个月我们支付了多少工资。为此,我们需要在数据库中合计他们的工资金额,如下所示:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID

我知道如果我没有在上面的代码中使用< code>GROUP BY,我会得到一个错误。这就是我不明白的地方。

我们正在从员工表中选择员工ID。SUM()被告知它必须从员工表中添加MonthlySalary列。因此,它应该直接去添加这些数字,而不是对它们进行分组然后添加它们。

这就是一个人的做法 - 看看员工表并添加所有数字。他们为什么要费心去把它们分组,然后把它们加起来呢?

共有3个答案

邵宜年
2023-03-14

可悲的是,有一个数据库支持您建议的语法:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee

然而,MySQL并不像你所期望的那样。它返回每个人每月工资的总和,以及一个任意的EmployeeId。唉。

你的问题是关于SQL语法的。答案是,SQL就是这样定义的,不会改变。从< code>SELECT子句中确定聚合字段并非不合理,但这不是这种语言的定义方式。

然而,我确实对这个问题有些同情。许多学习SQL的人认为“分组”是在对行进行排序的上下文中完成的事情。类似于“对美国的城市进行排序,并在输出中按州对它们进行分组”。有道理。但是SQL中的“group by”实际上是“summarize by”而不是“keep together”。

耿建弼
2023-03-14

如果你想把所有的数字加起来,你就不会有一个GROUP BY:


SELECT SUM(MonthlySalary) AS TotalSalary
FROM Employee
+-----------+
|TotalSalary|
+-----------+
|777400     |
+-----------+

分组依据的要点是,您可以获得每个雇员的单独总计。

+--------+------+
|Employee|Salary|
+--------+------+
|John    |123400|
+--------+------+
|Frank   |413000|
+--------+------+
|Bill    |241000|
+--------+------+
岳泉
2023-03-14

为了解释起见,如果您将GROUP BY视为“每个”,可能会更容易。查询如下:

SELECT empid, SUM (MonthlySalary) 
FROM Employee
GROUP BY EmpID

正在说:

“给我每个空的每月工资总额”

如果你的桌子看起来像这样:

+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1    |200         |
+-----+------------+
|2    |300         |
+-----+------------+

结果:

+-+---+
|1|200|
+-+---+
|2|300|
+-+---+

求和似乎没有任何作用,因为一个数的和就是那个数。另一方面,如果它看起来像这样:

+-----+------------+
|empid|MontlySalary|
+-----+------------+
|1    |200         |
+-----+------------+
|1    |300         |
+-----+------------+
|2    |300         |
+-----+------------+

结果:

+-+---+
|1|500|
+-+---+
|2|300|
+-+---+

然后它会,因为有两个空的1加在一起。不知道这个解释是否有帮助,但我希望它能使事情变得更清晰一些。

 类似资料:
  • 问题内容: 基数实际上是什么意思?我们为什么需要它? 问题答案: 您可能并不总是希望将整数解析为以10为底的数字,因此提供基数可以指定其他数字系统。 基数是一位数字的值数。十六进制为16。八进制为8,二进制为2,依此类推… 在该函数中,您可以执行一些操作来提示基数而不提供基数。如果用户输入的字符串与其中一个规则匹配,但没有明确规定,则这些方法也可能对您不利。例如:

  • 问题内容: 我开始使用RxJS,但我不明白为什么在此示例中我们需要使用类似or 的函数;数组的数组在哪里? 如果有人可以直观地解释正在发生的事情,那将非常有帮助。 问题答案: 当您有一个Observable的结果是更多Observable时,可以使用flatMap。 如果您有一个由另一个可观察对象产生的可观察对象,则您不能直接过滤,缩小或映射它,因为您有一个可观察对象而不是数据。如果您生成一个可观

  • 问题内容: 好的,假设我们有两个表,和。在评论中,我们有一列,它表示哪个用户键入了该特定评论。为什么我们需要将其指定为外键?如果我们不这样做,它将仍然有效。我们指定主键,因为据我所知,它可以使查询速度更快(我们只需要搜索一行,而当我们没有主键/索引时,则必须遍历所有行)。这只是一种良好的编码习惯吗? 问题答案: 使用外键时,您将获得: 数据的完整性 更快的查询。 用户: 用户ID: 1个 2个 3

  • 问题内容: 我一直在研究,发现从2.1开始就可以使用实体图。 但是我还不了解实体图的优点。 我知道使用实体图的优点之一是我们只能在整个实体中指定要获取的数据,但是如果我们要整个实体,还有其他理由使用实体图吗?还是仅在要检索部分数据时才应使用实体图? 当我们使用实体图时,它还有其他目的或优点,我想知道。 问题答案: 在Jpa中,休眠与关联关系一直是性能的问题。 一次又一次地在事务中延迟加载关联会导致

  • 我是Hadoop和编程的新手,我对Avro模式演变有点困惑。我将解释到目前为止我对Avro的理解。 Avro是一种串行化工具,它存储二进制数据,其json模式位于顶部。模式如下所示。 现在我的问题是为什么我们需要进化?我已经了解到,我们可以在新字段的模式中使用<code>default</code>选项;但是,如果我们在文件中添加一个新的模式,早期的模式将被覆盖。一个文件不能有两个架构。 另一个问

  • 问题内容: Angular应用使用属性而不是事件。 为什么是这样? 问题答案: ng-click包含一个角度表达式。Angular表达式是在Angular 范围的上下文中求值的,该范围绑定到具有ng- click属性的元素或该元素的祖先。 Angular表达式语言不包含流控制语句,也不能声明变量或定义函数。这些限制意味着模板只能访问由控制器或指令提供的变量和运行功能。