Mysql SUM CASE仅包含唯一ID

时间:2014-10-28 13:32:07

标签: mysql sum case

通过一个例子解释最简单。

父亲有孩子赢得比赛。

有多少父亲的后代赢得了一场比赛,总共有多少次比赛有父亲的后代获胜。 (获胜者和胜利者)

我可以很容易地计算出胜利的总数,但有时一个孩子赢得不止一场比赛,所以要弄明白,如果孩子赢了,我只需要总和,而不是所有时间都赢了。

在下面的查询摘录中我不能使用Distinct,所以这不起作用

SUM(CASE WHEN r.finish = '1' AND DISTINCT h.runnersid THEN 1 ELSE 0 END ) AS winners,

这也行不通

SUM(SELECT DISTINCT r.runnersid FROM runs r WHERE r.finish='1') AS winners

当我需要找到总胜利时,这是有效的。

SUM(CASE WHEN r.finish = '1' THEN 1 ELSE 0 END ) AS wins,

这是一个sqlfiddle http://sqlfiddle.com/#!2/e9a81/1

3 个答案:

答案 0 :(得分:2)

让我们一步一步来。

你有两条信息要找:谁赢了一场比赛,又有多少比赛。

拿第一个,你可以选择一个独特的runnersid,他们有第一名:

SELECT DISTINCT runnersid 
FROM runs
WHERE finish = 1;

对于第二个,您可以选择他们拥有第一名的每个runnersid,计算返回的行数,并按runnersid分组以获得每个的总胜利:

SELECT runnersid, COUNT(*) AS numWins
FROM runs
WHERE finish = 1
GROUP BY runnersid;

第二个实际上拥有你想要的一切。你不需要对第一个查询做任何事情,但是我用它来帮助演示我在尝试完成这样的任务时所采取的思考过程。

以下是SQL Fiddle示例。

修改

正如您所见,您在这里并不需要SUM。因为完成代表比赛的一个地方,你不想要该值,但你想要计算胜利的数量。

<强> EDIT2

基于OP要求的额外编辑。以上内容与OP的需求不符,但我将其留作未来读者的参考。正如我现在所理解的那样,OP真正需要的是每个父亲参加比赛的孩子数量。我将再一步一步解释我的思考过程。

首先,我写了一个简单的查询,提取所有获胜的父子对。我能够使用GROUP BY获得不同的获胜对:

SELECT father, name
FROM runs
WHERE finish = 1
GROUP BY father, name;

一旦我这样做了,我用它是一个子查询和COUNT(*)函数来获得每个父亲的获胜者数量(这意味着我必须按父亲分组):

SELECT father, COUNT(*) AS numWinningChildren
FROM(SELECT father, name
      FROM runs
      WHERE finish = 1
      GROUP BY father, name) t
GROUP BY father;

如果你只需要有胜利孩子的父亲,你就完成了。如果你想看到所有的父亲,我会写一个查询来选择所有父亲,用上面的结果集加入它,并用{0}替换numWinningChildren为空的任何值。

我会把那部分留给你来挑战自己一点。另外因为SQL Fiddle现在已经失败了,我无法测试我的想法,但我能够成功地测试上面的那些。

答案 1 :(得分:1)

我想你想要父亲的名字以及他儿子的胜利计数。

select father, count(distinct(id)) wins 
from runs where father = 'jack' and finish = 1
group by father

sqlfiddle

答案 2 :(得分:0)

我不确定这是否是您正在寻找的

Select user_id, sum(case when finish='1' then 1 else 0 end) as total From table Group by user_id