Mysql 使用SQL聚合和计算统计数据

Mysql 使用SQL聚合和计算统计数据,mysql,sql,aggregate-functions,Mysql,Sql,Aggregate Functions,我已经拍摄了他们的游戏,在这个游戏中,用户在一周的时间里互相竞争,以积累最多的分数。我想编写一个查询,从shots表聚合统计数据。此处关注的表格和关系如下: 用户有许多竞争周期 比赛期间属于用户 比赛期间有很多镜头 射击属于比赛阶段 在快照表中,我要处理以下字段: 结果-->字符串值:赢、输或平 金额-->整数值:例如-100、0、2000等 对于每个用户,我希望返回具有以下聚合统计信息的结果集: 元宵 失数 并列计数 总投篮次数(获胜次数+失球次数+平局次数) 总金额(总金额) 每杆

我已经拍摄了他们的游戏,在这个游戏中,用户在一周的时间里互相竞争,以积累最多的分数。我想编写一个查询,从shots表聚合统计数据。此处关注的表格和关系如下:

  • 用户有许多竞争周期
  • 比赛期间属于用户
  • 比赛期间有很多镜头
  • 射击属于比赛阶段
在快照表中,我要处理以下字段:

  • 结果-->字符串值:赢、输或平
  • 金额-->整数值:例如-100、0、2000等
对于每个用户,我希望返回具有以下聚合统计信息的结果集:

  • 元宵
  • 失数
  • 并列计数
  • 总投篮次数(获胜次数+失球次数+平局次数)
  • 总金额(总金额)
  • 每杆平均金额(总金额/总杆数)

我在这个问题上已经做了几个小时了,但没有取得多大进展。统计函数把我搞糊涂了。一位朋友建议我尝试在一个名为shot_records的新虚拟表中返回结果。

这是一个基本解决方案,计算给定玩家所有射击的统计数据(您没有指定是否需要基于每个比赛周期):


请注意,在计算“总韩元”数字时,这包括负数(即总韩元因损失而减少)。如果这不是适合您游戏的正确算法,您将在查询中出现的两个位置将
SUM(Amount)
更改为
SUM(If(Amount>0,Amount,0))

这是一个基本解决方案,计算给定球员所有投篮的统计数据(您没有指定是否需要每个比赛周期的统计数据):


请注意,在计算“总韩元”数字时,这包括负数(即总韩元因损失而减少)。如果这不是适合您游戏的正确算法,您将在查询中出现的两个位置将
SUM(Amount)
更改为
SUM(If(Amount>0,Amount,0))

老兄,你怎么这么快就想到了呢?是的,在你赢的金额中,值可以是正的,也可以是负的,所以只要把它加起来,你就会得到赢(或输)的总额。老实说,这是一个非常简单的查询。棘手的一点是处理前三列所需的“计算这一行,但仅当某些条件为真时”的问题,由于这一点实际上经常出现,我只需查找if的MySQL语法(其他DBs将不得不使用更详细的情况),信用是由于原始问题中对问题的陈述非常清楚。伙计,你怎么这么快就想到了这个问题?是的,在赢得的金额中,值可以是正的或负的,所以只要将其相加,就可以得到赢得(或失去)的总金额。老实说,这是一个非常简单的查询。棘手的一点是处理前三列所需的“计算这一行,但仅当某些条件为真时”的问题,由于这一点实际上经常出现,我只需查找if的MySQL语法(其他DBs将不得不使用更详细的情况),值得称赞的是,原始问题中对问题的描述非常清楚。MySQL没有虚拟表,取而代之的是视图。MySQL没有虚拟表,取而代之的是视图。
 SELECT user, SUM(IF(result = 'WON', 1, 0))  AS won_count, 
              SUM(IF(result = 'LOST', 1, 0)) AS lost_count, 
              SUM(IF(result = 'TIED', 1, 0)) AS tied_count, 
              COUNT(*)                       AS total_shots_count, 
              SUM(amount_won)                AS total_amount_won, 
              (SUM(amount_won) / COUNT(*))   AS avg_amount_won_per_shot 
 FROM user U INNER JOIN competition_periods C ON U.user_id = C.user_id
 INNER JOIN shots S ON C.competition_period_id = S.competition_period_id
 GROUP BY user