如何从SQL中的SUM()子查询中获取MAX()

时间:2016-02-28 19:47:16

标签: mysql sum max

我有一张表,我需要计算一些值的总和,然后取每个总和的最大值。 我的代码如下:

SELECT q1.prod_code, q1.cust_code, MAX(q1.total_sum) 
FROM (SELECT k2.prod_code, k2.cust_code, SUM(k2.price) AS total_sum FROM reservation AS k2 GROUP BY k2.prod_code, k2.cust_code) AS q1 
GROUP BY q1.prod_code

从上面我得到了几乎正确的结果。 我必须得到:

prod_code | cust_code | total_sum
  1001 | 10002 | 75个
  1002 | 10005 | 209个
  1003 | 10005 | 350个
  1004 | 10002 | 650

但不是这样,我得到了:

prod_code | cust_code | total_sum
  1001 | 10001 | 75个
  1002 | 10001 | 209个
  1003 | 10003 | 350个
  1004 | 10001 | 650

实际上,cust_code是子查询中每个单独prod_code的第一个值。

你知道可能出现什么问题吗?

1 个答案:

答案 0 :(得分:0)

正如我的评论中所述,mysql允许您从group by子句中省略非聚合字段。在这样做时,您无法保证这些省略值的结果。

要解决您的问题,您需要将join合并后的查询返回原始查询。虽然使用多个聚合不是很漂亮,但这样的事情应该有效:

SELECT t1.prod_code, t2.cust_code, t1.max_total_sum
FROM (
    SELECT prod_code, MAX(total_sum) max_total_sum
    FROM (
        SELECT prod_code, cust_code, SUM(price) AS total_sum 
        FROM reservation
        GROUP BY prod_code, cust_code) AS q1 
    GROUP BY prod_code
) t1 JOIN (
   SELECT prod_code, cust_code, SUM(price) AS total_sum 
   FROM reservation
   GROUP BY prod_code, cust_code) AS t2 ON t1.prod_code = t2.prod_code
       AND t1.max_total_sum = t2.total_sum