【发布时间】: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