有没有办法根据条件对列进行分组和求和?
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
答案 0 :(得分:4)
你需要有一个子查询,它为你提供了至少有1条记录的所有代码,其中update = 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}}