mysql - 聚合 MySQL 函数总是返回一行吗?

标签 mysql database sum aggregate-functions

如果这真的很基本,我很抱歉,但是:

我觉得在某些时候我没有遇到这个问题,现在我遇到了,所以要么我之前做了一些完全不同的事情,要么我的语法跳过了一步。

例如,我有一个查询,我需要返回具有特定数据的所有行以及具有这些列的总计的另一列。如果一切如我所料,它看起来像:

 SELECT
 order_id,
 cost,
 part_id,
 SUM(cost) AS total
 FROM orders 
 WHERE order_date BETWEEN xxx AND yyy

我会得到我的订单的所有行,并将总数添加到每行的末尾。我知道每次总数都是一样的,但这是预料之中的。现在为了让它工作,我正在使用:

 SELECT
 order_id,
 cost,
 part_id,
 (SELECT SUM(cost)
 FROM orders
 WHERE order_date BETWEEN xxx AND yyy) AS total
 FROM orders 
 WHERE order_date BETWEEN xxx AND yyy

基本上运行相同的查询两次,一次用于总数,一次用于其他数据。但是,如果我想要 SUM 和我不知道的平均成本,那么我会做同样的查询 3 次,这似乎是错误的,这就是为什么我认为我正在做一些非常基本的错误。

非常感谢任何帮助。

最佳答案

您需要使用 GROUP BY这样才能得到你想要的结果:

SELECT
order_id,
part_id,
SUM(cost) AS total
FROM orders 
WHERE order_date BETWEEN xxx AND yyy
GROUP BY order_id, part_id

这将对您的结果进行分组。请注意,由于我假设 order_idpart_id 是复合 PK,因此上面的 SUM(cost) 可能是 = cost (因为您按保证唯一的两个字段的组合进行分组。下面的相关子查询将克服此限制)。

需要在 GROUP BY 行中指定获取的任何非聚合行。

有关详细信息,您可以在此处阅读有关 GROUP BY 的教程:

MySQL Tutorial - Group By


编辑:如果您想将一个列同时用作聚合和非聚合,或者如果您需要取消分离您的组,您将需要使用子查询:

SELECT
or1.order_id,
or1.cost,
or1.part_id,
(
  SELECT SUM(cost)
  FROM orders or2
  WHERE or1.order_id = or2.order_id
  GROUP BY or2.order_id
) AS total
FROM orders or1
WHERE or1.order_date BETWEEN xxx AND yyy

关于mysql - 聚合 MySQL 函数总是返回一行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1192019/

相关文章:

c++ - 在数组中查找加起来等于给定数字的数字 C++

mysql - sql中的求和语句

MySQL 与 JRuby 的问题

database - 用于将现实世界的选择排列表示为树的数据模型模式的名称是什么?

sql - 有用的常用 SQL 数据模型?

java - 从数据库 SQL 查询创建 Java 对象

c - 总结c中的行,显示列中的垃圾数字

php - 从mysql获取具体数据

php - 在 .then() 函数内尝试 angular.forEach 时出错

sql - 按时间限制SQL结果,MySQL