2015-03-25 2 views
0

Я довольно новичок в SQL и имею проблему с подзапросом, который выполняет подсчет, отличный от неправильной группировки. Я был бы признателен за любую помощь с этим.Подзапрос, выполняющий COUNT DISTINCT в неправильной группировке

У меня есть участники сеансов для определенной группы, которые я запрашиваю для отчета MS SQL Server (SSRS 2008).

Я пытаюсь присоединиться к TblGroup, TblGroupSession и TblGroupSUAttendee и считать число DISTINCT GroupSUAttendee в любой группе. Нижеприведенный запрос подсчитывает различное количество GroupSUAttendee на любой СЕССИИ, поэтому, когда я добавляю счеты вместе для группы, я получаю дубликаты, если TblGroupSUAttendee посетил более одного сеанса.

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

Мысли/советы/указатели очень ценится. Благодаря Eils

SELECT 
    TblGroup.GroupId 
    ,TblGroupSession.GroupSessionId 
    ,TblGroupSession.GroupSessionDate 
    ,TblGroupSUAttendee.GroupSUAttendeeCount 

FROM 
    TblGroup 
    LEFT OUTER JOIN TblGroupSession 
    ON TblGroup.GroupId = TblGroupSession.GroupSessionGroupId 

LEFT OUTER JOIN (select COUNT(DISTINCT GroupSUAttendeeId) AS GroupSUAttendeeCount, 
        GroupSUAttendeeGroupSessionId 
        FROM TblGroupSUAttendee 
        GROUP BY GroupSUAttendeeGroupSessionId) as TblGroupSUAttendee ON GroupSUAttendeeGroupSessionId = TblGroupSession.GroupSessionId 

WHERE 
GroupSessionDate >= @StartDate AND GroupSessionDate <= @EndDate 

ответ

0

Если вы хотите посчитать участников в группах, а затем использовать group by, но не включают в каждой сессии информацию. Другими словами, просто объедините группы с сеансами и сеансы с участниками в одном запросе. Затем суммируйте по GroupId и посчитайте участников:

SELECT g.GroupId, 
     COUNT(DISTINCT GroupSUAttendeeId) AS GroupSUAttendeeCount 
FROM TblGroup g LEFT OUTER JOIN 
    tblGroupSession gs 
    ON g.GroupId = gs.GroupSessionGroupId LEFT OUTER JOIN 
    TblGroupSUAttendee ga 
    ON ga.GroupSUAttendeeGroupSessionId = gs.GroupSessionId 
GROUP BY g.GroupId; 
+0

Спасибо за ваш быстрый ответ! Я сделал небольшое исправление «ON ga.GroupSUAttendeeGroupSessionId = gs.GroupSessionId», и он работает как отдельный запрос, но мне нужно держать строки для сеансов в моем запросе для других целей, поэтому не совсем уверен, как сделать этот подзапрос – EileenS