SQL查询总结"赢得"值与所有值的总和

时间:2014-04-27 10:32:07

标签: sql sql-server

我有以下三个表格。

Player:
-------
Id, Name

Achievement:
------------
Id, Title, Points

EarnedAchievement:
------------------
Id, PlayerId, AchievementId, EarnedDate

我想选择每个玩家的名字,他们的成就点数和他们获得的成就点数相对于可能获得的成就点总数(换句话说,该特定玩家所获得的进度(earnPoints / possiblePoints))。

这是我到目前为止所做的:

select p.Id, p.Name, sum(a.Points) as AP from Player as p
inner join EarnedAchievement as ea on ea.PlayerId = p.Id
inner join Achievement as a on ea.AchievementId = a.Id
group by p.Id, p.Name
order by p.Name

这给了我以下内容:

1, Barack Obama, 140
2, Bruce Willis, 125
etc.

我想要第四列代表玩家所获得的进步。 (可获得的总成就点数为210,因此他们的进度列应分别为66%和59%)。

任何指针都会受到极大关注。

修改

请注意,所有成就点的总和不是恒定的,所以当添加新成就时,数字210会增加。

1 个答案:

答案 0 :(得分:3)

您可以使用带有单值表的交叉连接尝试以下操作:

select p.Id, p.Name, sum(a.Points) as AP, cast(sum(a.Points) as decimal)/total.totalSum as Progress
from Player as p
cross join (SELECT SUM(Points) as totalSum FROM Achievement) as total
inner join EarnedAchievement as ea on ea.PlayerId = p.Id
inner join Achievement as a on ea.AchievementId = a.Id
group by p.Id, p.Name, total.totalSum
order by p.Name

编辑:正如Joachim Isaksson所提到的,使用SQL Server,您必须在组中添加total.totalSum。这不是MySQL的强制要求。

this上测试,看起来很好。

另请注意,您应该尝试避免与大型表交叉连接(它是基本的笛卡尔积,因此结果的行数是输入表的行数的乘积)。但是,您在这里加入了一个单行表,所以它不是一个问题