2013-12-04 6 views
0

Моя упрощена схема является:запрос, чтобы получить подсчитывать элемент для группы с общей суммы баллов для каждой группы

  • Участники (Id, Email)
  • команды (Id, Name)
  • TeamMembers многие к -many mapping для команд - участников (TeamId, ParticipantId)
  • Ответы (Id, ParticipantId)
  • ReponseDetails (Id, ResponseId, Points, BonusPoints)

Для каждой команды, которая имеет по крайней мере 2 членов, которые я хочу получить TeamID, Total Member Count и Тотал очки команды. Total Team Points - это сумма бонусных очков и очков от ResponseDetails от всех членов команды. Обратите внимание, что Участник может быть членом более чем одной команды.

До сих пор у меня есть этот запрос:

select 
    tm.[TeamId], 
    count(tm.[ParticipantId]) as 'TotalMemberCount', 
    sum(rd.[Points] + rd.[BonusPoints]) as 'TotalTeamPoints' 
from 
    [TeamMembers] tm 
left outer join 
    [Responses] r on r.[ParticipantId] = tm.[ParticipantId] 
left outer join 
    [ResponseDetails] rd on r.[Id] = rd.[ResponseId] 
where 
    tm.[TeamId] in (select [TeamId] from [TeamMembers] 
        group by [TeamId] having count([ParticipantId]) > 1) 
group by 
    tm.[TeamId] 

Он возвращает правильный TeamId и TotalTeamPoints, но неверная TotalMemberCount (гораздо больше). У меня такое чувство, что я пропустил что-то простое, как группировка.

ответ

0

Я подозреваю, что левые внешние соединения вызывают некоторые дубликаты, которые подсчитываются в «count (tm. [MemberantId])». Попробуйте «count» (отдельный тм. [Участник]) ».

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