2014-04-27 3 views
0

У меня следующие три таблицы.SQL-запрос для суммирования «заработанных» значений по отношению к сумме всех значений

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

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

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

Я хочу, чтобы выбрать имя каждого игрока, свои заработанные очки достижений, и их заработанные очки достижений по отношению к общей сумме очки достижений можно заработать (другие слова, прогресс, заработанный этим конкретным игроком (earnedPoints/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% соответственно).

Любые указатели были бы значительно оценены.

EDIT:

Пожалуйста, обратите внимание, что сумма всех очков достижений не является постоянной, так что число 210 будет увеличиваться при добавлении новых достижений.

+0

Всего достижений всегда 210? –

+0

Является ли 210 константой или получена где-то в базе данных? –

+0

добавьте другое производное поле к выбору с помощью (sum (a.points)/210) * 100 – brumScouse

ответ

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 

Редактировать: Как упоминалась Йоахим Isaksson с SQL Server, вы должны добавить total.totalSum в вашей группе , Это не обязательно для MySQL.

Протестировано на this, все хорошо.

Также обратите внимание, что вы должны стараться избегать перекрестных объединений с большими таблицами вообще (это базовое декартово произведение, поэтому количество строк результата является произведением чисел строк таблиц ввода). Здесь, однако, вы присоединяетесь к 1-гребному столу, так что это не probleM

+0

Спасибо за ваш быстрый ответ. Тем не менее, этот запрос дает мне пару ошибок: Msg 4104, Level 16, State 1, Line 4 Идентификатор из нескольких частей «Achievement.Points» не может быть связан. Msg 8155, уровень 16, состояние 2, строка 5 Для столбца 1 «всего» не указано имя столбца. Msg 207, уровень 16, состояние 1, строка 1 Недопустимое имя столбца 'totalSum'. –

+0

Вглядываясь в него. Btw, для потенциальных будущих вопросов, очень полезно использовать http://sqlfiddle.com/ –

+0

Я не знал об этом инструменте. Я обязательно буду использовать это в будущем, спасибо :) –

Смежные вопросы