【问题标题】:SQL - sum (column 1 + column2 + column3 ) and select max value of sum in each groupSQL - sum (column 1 + column2 + column3 ) 并选择每组总和的最大值
【发布时间】:2014-07-27 08:10:12
【问题描述】:

这是我的带有示例数据的表格:

id|group_id|column1|column2|column3| 
--------------------------------------
1    1    |    1        1        0
2    1    |    1        1        1
3    2    |    0        0        0
4    2    |    1        1        1
5    1    |    1        0        0
6    3    |    0        0        0

预期结果集:(结果应显示每组中的最大总和(col 1 + col 2 + col 3))

id|group_id|column1|column2|column3| 
--------------------------------------
2    1    |    1        1        1
4    2    |    1        1        1
6    3    |    0        0        0

实际结果集: (select *, max(m.column1 + m.column2 + m.column3) as total from my_table m group by m.group_id) 这是错误的

id|group_id|column1|column2|column3|total| 
------------------------------------------
1    1    |    1        1        0      3 
3    2    |    0        0        0      3
6    3    |    0        0        0      0  

我对 SQL 很陌生,似乎查询选择了每个组中的第一个 id。

获得预期结果的最佳方法是什么?

【问题讨论】:

  • 您确定您的预期结果集正确吗?
  • 您的预期结果集甚至不包含任何求和值

标签: mysql sql


【解决方案1】:

你可以得到你想要的结果,即使用子选择:

第一步:

SELECT
    MAX(m1.column1 + m1.column2 + m1.column3)
FROM
    my_table m1
GROUP BY
    m1.group_id

将为您提供每个 group_id 的最大总数。

由于非聚合列中的值是不确定的,如果此列包含组的不同值,则不能像以前那样简单地聚合,而是使用第一步中的查询进行子选择:

完成查询

SELECT
     *,
     m.column1 + m.column2 + m.column3 as total
FROM
    my_table m
WHERE
    m.column1 + m.column2 + m.column3 = (
    SELECT
        MAX(m1.column1 + m1.column2 + m1.column3)
    FROM
        my_table m1
    WHERE
        m.group_id = m1.group_id
    GROUP BY
        m1.group_id
);

Demo

【讨论】:

    【解决方案2】:

    看起来您正在尝试获取每组中产生最高 3 列总和的行:

    select a.*
    from my_table a
    join (
      select group_id, max(column1 + column2 + column3) summation
      from my_table
      group by group_id) b on a.group_id = b.group_id and a.column1 + a.column2 + a.column3 = b.summation;
    

    【讨论】:

    • 如果对您有用,请接受该解决方案。
    • 这个答案依赖于group by 的 MySQL 扩展,该扩展被明确记录为不起作用(即使用 group by 中未包含在 group by 子句中的列并且不具有聚合功能)。你可以在这里阅读:dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html
    • @GordonLinoff,感谢您指出。我一直认为 MySQL 会选择它看到的第一行,但我想这可能是任意的。
    【解决方案3】:

    您没有准确指定必须返回 column1、column2 和 column3 的哪些值。

    select m.*,n.* from 
      m,
      (select 
        group_id as n_group_id, 
        max(column1+column2+column3) as n_total 
      from m group by group_id) as n 
    where m.group_id=n_group_id and (column1+column2+column3)=n_total
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2022-11-13
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多