高级查询 - 选择,按条件求和并返回累加值

Posted

技术标签:

【中文标题】高级查询 - 选择,按条件求和并返回累加值【英文标题】:Advance query - Select, sum on condition and return the accumulated value 【发布时间】:2019-01-05 11:58:14 【问题描述】:

用户预测给定比赛的球队获胜者。根据预测的球队以及预测是否正确,根据所选球队的赔率授予不同的分数。考虑以下两个 SQL 表及其字段。

如果比赛 ID 30 的预测正确(意思是 predictions.team_id 需要与 matches.match_winner 匹配),我想要一个汇总所有用户赔率的查询。最终结果应该是这样的

Matthew 预测正确匹配 5 和 7(赔率 3.4 + 2.4),共 5.8 分。

内维尔预测正确匹配 7 和 9(赔率 2.4 + 2.0),共 4.4 分

【问题讨论】:

可能是因为您的结果与建议和接受的答案相矛盾。只是一个猜测,不要忘记我们是为社区而不是为我们自己打勾。 【参考方案1】:

使用带有条件SUM 的聚合查询,例如:

SELECT
    p.username,
    SUM(CASE WHEN m.match_winner = m.team_a THEN m.team_a_odds ELSE m.team_b_odds END)
FROM 
    predictions p
    INNER JOIN matches m
        ON p.match_id = m.id AND p.team_id = m.match_winner
WHERE p.tournament_id = 30
GROUP BY p.username

【讨论】:

Neville predicted correctly match 7 and 9 (odds 2.4 + 2.0), total 4.4 points 这不满意。【参考方案2】:
SELECT
  USERNAME,
  SUM(IF(CASE WHEN MATCH_WINNER = TEAM_A, TEAM_A_ODDS, TEAM_B_ODDS))
FROM
  PREDICTIONS
INNER JOIN MATCHES
  ON MATCH_ID = MATCHES.ID AND 
    TEAM_ID = MATCH_WINNER
GROUP BY USERNAME;

但由于 Neville predicted correctly match 7 and 9 (odds 2.4 + 2.0), total 4.4 points 不满足...

SELECT
  USERNAME,
  SUM( TEAM_B_ODDS)
FROM
  PREDICTIONS
INNER JOIN MATCHES
  ON MATCH_ID = MATCHES.ID AND 
    TEAM_ID = MATCH_WINNER
GROUP BY USERNAME;

OP 总是对 TEAM_B_ODDS 求和

虽然我相信 OP 评估 Naville 的情况是错误的。

【讨论】:

以上是关于高级查询 - 选择,按条件求和并返回累加值的主要内容,如果未能解决你的问题,请参考以下文章

详细教程一文参透MongoDB聚合查询

选择对两列求和并希望将结果用作选择条件的查询 [重复]

高级查询,分组查询

为高级查询选择基于 Java 的键值存储

高级查询及分页总结

条件,高级查询