4

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

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

例如,我有一个查询,我需要返回包含某些数据的所有行以及另一列,其中一个列的总数。如果事情按我的预期工作,它看起来像:

 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 次,这似乎真的是错误的,这就是为什么我认为我正在做一些非常基本的错误。

非常感谢任何帮助。

4

1 回答 1

7

您需要这样使用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_idandpart_id是一个复合 PK,SUM(cost)因此上面可能是= cost(因为您通过两个字段的组合进行分组,这保证是唯一的。下面的相关子查询将克服这个限制)。

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

有关更多信息,您可以阅读有关GROUP BY此处的教程:

MySQL 教程 - 分组


编辑:如果你想使用一个列作为聚合和非聚合,或者如果你需要取消你的组,你将需要使用这样的子查询:

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
于 2009-07-28T05:09:12.147 回答