【问题标题】:SQL Server Averages/Sums/Groups/Counts Query IssueSQL Server 平均值/总和/组/计数查询问题
【发布时间】:2013-05-15 22:15:27
【问题描述】:

我有下表:

╔══════════╦════════╦═══════╦═══════╗ ║ PlayerID ║ GameID ║ Stat1 ║ Stat2 ║ ╠══════════╬════════╬═══════╬═══════╣ ║ 1 ║ A ║ 2 ║ 1 ║ ║ 1 ║ B ║ 4 ║ 2 ║ ║ 1 ║ C ║ 6 ║ 5 ║ ║ 2 ║ A ║ 2 ║ 4 ║ ║ 2 ║ B ║ 2 ║ 6 ║ ║ 2 ║ C ║ 2 ║ 8 ║ ║ 2 ║ D ║ 4 ║ 2 ║ ║ 2 ║ E ║ 6 ║ 1 ║ ║ 3 ║ A ║ 5 ║ 9 ║ ║ 3 ║ G ║ 6 ║ 4 ║ ║ 3 ║ 高 ║ 4 ║ 2 ║ ║ 3 ║ N ║ 8 ║ 6 ║ ╚══════════╩════════╩═══════╩═══════╝

我想要达到的目标如下:

╔══════════╦═══════════╦═══════════════════╦══════ ═════════════╗ ║ PlayerID ║ GameCount ║ Stat 1 Avg / Game ║ Stat 2 Avg / Game ║ ╠══════════╬═══════════╬═══════════════════╬══════ ═════════════╣ ║ 1 ║ 3 ║ 4 ║ 2.66 ║ ║ 2 ║ 5 ║ 3.2 ║ 4.2 ║ ║ 3 ║ 4 ║ 5.75 ║ 5.25 ║ ╚══════════╩═══════════╩═══════════════════╩══════ ═════════════╝

游戏计数应为每位玩家的总游戏数,统计数据应为每场游戏的平均数。基本上 PlayerID 1 的计算如下:

“Stat1 平均 / 游戏” = (2 + 4 + 6) / 3 “Stat2 平均 / 游戏” = (1 + 2 + 5) / 3

我已经尝试了使用 SUMS 和 COUNTS 组合的同一查询的多种变体,但 GameCount 永远不会正确。下面是我尝试过的一个示例

SELECT PlayerID, 
COUNT(GameID) AS GameCount, 
SUM(Stat1) / COUNT(GameID)  "Stat 1 Avg / Game",
SUM(Stat2) / COUNT(GameID)  "Stat 2 Avg / Game"
FROM PublishedStats A
GROUP BY PlayerID

SELECT PlayerID, 
COUNT(GameID) OVER (PARTITION BY PlayerID) AS GameCount, 
SUM(Stat1) /  COUNT(GameID) OVER (PARTITION BY PlayerID) "Stat 1 Avg / Game", 
SUM(Stat2) /  COUNT(GameID) OVER (PARTITION BY PlayerID) "Stat 2 Avg / Game", 
FROM Stats
GROUP BY PlayerID, GameID

【问题讨论】:

  • 我认为您的第一个查询是正确的,您不需要第二个。
  • 除非 GameID 包含 NULL 值,否则我同意 @Jasmine - 您实际上从第一个查询中获得了哪些值?
  • @Jasmine 抱歉,我创建了错误的基础数据,PlayerID 1 应该有两个游戏 A 和一个游戏 B 的统计数据。在上面的查询中,它会说明他玩了 3 场比赛,而实际上他玩了2 因为一场比赛有两个不同的统计数据 – chnt 1 小时前删除
  • @chunt 。 . .如果一场比赛有多行,如何计算平均值?
  • 好的,所以游戏可以生成一对多的统计数据行?如果你正确地规范了这个表,你的查询会很容易。您当前的表结构是有效的,但确实使一些查询(例如“有多少独特的游戏”)变得困难,因为您为每个游戏记录了未知数量的行。如果您有一个每场比赛一行的 game_master 表(以及另一个用于统计数据的表),那么您的查询将很简单。

标签: sql sql-server-2008 group-by average


【解决方案1】:

所以只需添加 DISTINCT 关键字。

SELECT PlayerID, 
COUNT(DISTINCT GameID) AS GameCount, 
AVG(Stat1)  "Stat 1 Avg / Game",
AVG(Stat2)  "Stat 2 Avg / Game"
FROM PublishedStats A
GROUP BY PlayerID

【讨论】:

  • 是的....这正是具有讽刺意味的我只是在检查之前尝试过...谢谢。
  • 不应该是SUM(Stat1) / COUNT(DISTINCT GameID)吗?
  • 是的,Markus 你是对的,最大的问题是获得正确的游戏计数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多