Mysql组和基于条件的总和

时间:2016-03-22 20:51:53

标签: mysql sql

有没有办法根据条件对列进行分组和求和?

id  |  code  |  total | to_update
1   |  A1001 |  2     | 0
2   |  B2001 |  1     | 1
3   |  A1001 |  5     | 1
4   |  A1001 |  3     | 0
5   |  A1001 |  2     | 0
6   |  B2001 |  1     | 0
7   |  C2001 |  11    | 0
8   |  C2001 |  20    | 0

在此示例中,我想对所有共享相同code的行进行分组和汇总,其中至少有一行的to_update值为1.按code列分组并总和total

上面的示例将导致:

code  total
A1001 12
B2001 2

5 个答案:

答案 0 :(得分:4)

你需要有一个子查询,它为你提供了至少有1条记录的所有代码,其中up​​date = 1,你需要将它连接到你的表并按照和总和进行分组:

select m.code, sum(total)
from mytable m
inner join (select distinct code from mytable where `to_update`=1) t on m.code=t.code
group by m.code

或者你也可以将to_update列加起来并过滤:

select m.code, sum(total)
from mytable m
group by m.code   
having sum(to_update)> 0 

答案 1 :(得分:1)

你可以这样做:

SELECT   code, SUM(total) AS total
FROM     mytable
GROUP BY code
HAVING   MAX(to_update) = 1

这假设 to_update 的可能值为0或1。

在此fiddle中实施,根据问题的要求输出结果。

由于此查询仅扫描表一次,因此它的性能优于进行连接的解决方案。

答案 2 :(得分:1)

您可以通过多种方式获得结果。一种方法是获取具有code的{​​{1}}值,然后您可以使用此值来获取to_update = 1 sum。这可以通过几种不同的方式完成 - 一种方法是使用您加入的子查询:

total

或者您可以使用select t1.code, sum(total) as Total from yourtable t1 inner join ( select distinct t.code from yourtable t where t.to_update = 1 ) t2 on t1.code = t2.code group by t1.code; 过滤掉行:

where exists

请参阅两个版本的SQL Fiddle with Demo。无论哪种方式,您都希望根据select t1.code, sum(total) as Total from yourtable t1 where exists (select 1 from yourtable t2 where t2.to_update = 1 and t1.code = t2.code) group by t1.code; 值过滤行,然后对其进行汇总。

答案 3 :(得分:0)

使用此查询:

private async void button1_Click(object sender, EventArgs e)
  {

    output.Text = "start";
    var intRet = await Task.Run(() => RunALot());
    output.Text += "   after run  ";
    output.Text += intRet.ToString();


}

//Removed the Async Task portion of the signature as this is CPU bound work.
private int RunALot ()
{

    int temp = 0;
    for (int ini = 0; ini <= 40000; ini++)
    {
        temp += ini;
    }
    return temp;
}

你有:

SELECT
a.code,
a.total
FROM
(SELECT all
  code as code,
  sum(total) as total,
  sum(`sum`.`update`) as status
  FROM `Test`.`sum`
  GROUP BY code) as a
WHERE a.status <> 0;

更新状态与0不同就足够了。

此致

答案 4 :(得分:0)

您可以使用in子句来选择具有to_update = 1值的代码列表,然后使用group by子句来获取总数

{{1}}