【问题标题】:Mysql SUM CASE with unique IDs only仅具有唯一 ID 的 Mysql SUM CASE
【发布时间】:2014-10-28 13:32:07
【问题描述】:

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

父亲的孩子在比赛中获胜。

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

我可以很容易地计算出获胜的总数,但有时一个孩子会赢得不止一场比赛,所以要计算出获胜者,我只需要计算孩子获胜的总和,而不是它获胜的所有次数。

在下面的查询摘录中,我不能使用 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

【问题讨论】:

  • 如果您愿意,请考虑遵循以下简单的两步操作: 1. 如果您还没有这样做,请提供适当的 DDL(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
  • @strawberry 感谢我添加小提琴的建议。
  • 这个问题读起来其实很有趣:)
  • 我也遇到过类似的情况,这对我帮助很大:stackoverflow.com/questions/14048098/…

标签: mysql sum case


【解决方案1】:

让我们一步一步来。

您要查找两条信息:谁赢得了一场比赛,以及他们参加了多少场比赛。

拿第一个,你可以选择一个不同的跑步者,他们获得第一名:

SELECT DISTINCT runnersid 
FROM runs
WHERE finish = 1;

对于第二个,您可以选择他们获得第一名的每个跑步者,计算返回的行数,然后按跑步者分组以获得每个跑步者的总获胜次数:

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;

如果您只需要父亲和孩子获胜,那么您就完成了。如果您想查看所有父亲,我会编写一个查询来选择所有父亲,将其与我们上面的结果集连接起来,并将 numWinningChildren 为空的任何值替换为 0。

我会把这部分留给你来挑战一下自己。也因为 SQL Fiddle 目前处于关闭状态,我无法测试我在想什么,但我能够成功地测试上面的那些。

【讨论】:

  • 没有完全回答我的问题,请参阅我的 sqlfiddle。
  • @stemie 我今天下午下班后会调查一下。我为我的误会道歉。如果你在那之前解决了这个问题,请告诉我。
【解决方案2】:

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

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

sqlfiddle

【讨论】:

    【解决方案3】:

    我不确定这是不是你要找的东西

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

    【讨论】:

    • 我可以解决这个问题SUM(CASE WHEN r.finish = '1' THEN 1 ELSE 0 END ) AS wins 我需要找到赢家,所以只有孩子赢了,而不是他们赢了多少次。
    猜你喜欢
    • 2014-02-28
    • 2020-11-06
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多