Sum / Count Distinct возвращается неправильно - PullRequest
0 голосов
/ 30 апреля 2019

Я могу вернуть 84 строки с моим отборным отчетом в моем столбце "ub.Id".

Когда я рассчитываю отбор или суммирование условно для этого столбца, возвращаемое значение неверно.

IЯ знаю, что есть темы по этому вопросу, но я не могу найти решение, и я должен что-то упустить.Это выглядит прямо передо мной.Возвращено 84 строки, но я, должно быть, пропускаю группу или что-то еще, и я сыграл с ней тонну.

Фокус на последних 3 столбцах

SELECT DISTINCT 
    o.Organization_Name,
    ui.DisplayName, 
    ui.NumLogins, 
    COUNT(uw.Title) Assigned,
    SUM(CASE WHEN uw.Status IS NULL THEN 1 ELSE 0 END) NotStarted,
    SUM(CASE WHEN uw.Status = 'incomplete' THEN 1 ELSE 0 END) InProgress,
    SUM(CASE WHEN uw.grade >=80 THEN 1 ELSE 0 END) Completed,
    COUNT(DISTINCT ub.Id) ShouldBe84a,
    SUM(CASE WHEN ub.Id > 0 THEN 1 ELSE 0 END) ShouldBe84b,
    ub.Id
FROM @Organizations o
INNER JOIN @UserInfo ui on ui.OrgId = o.OrgId
LEFT JOIN @UserWorkshop uw on uw.UserId = ui.UserId
LEFT JOIN @UserBehavior ub on ub.UserId = ui.UserId
WHERE username = 'user@email.com'
AND ub.Id IS NOT NULL
GROUP BY o.Organization_Name,
        ui.DisplayName,
        ui.NumLogins, 
        ub.id;

Любая помощь очень важнаоценил,

Бойд

** РЕДАКТИРОВАТЬ Решено Спасибо за помощь, указал мне в правильном направлении *

Решенный код:

select o.Organization_Name,ui.DisplayName, ui.NumLogins, 
count(distinct case when uw.Title Is Not Null then uw.Title else null end) Assigned,
count(distinct case when uw.Status Is Null then uw.Title else null end) NotStarted,
count(distinct case when uw.Status = 'incomplete' then uw.Title else null end) InProgress,
count(distinct case when uw.grade >=80 then uw.Grade else null end) Completed,
count(distinct case when ub.CaseStatus = 1 then ub.Id else null end) CasesSupported,
count(distinct case when ub.CaseOwnerId = ui.UserId then ub.Id else null end) CasesOwned
from @Organizations o
inner join @UserInfo ui on ui.OrgId = o.OrgId
left join @UserWorkshop uw on uw.UserId = ui.UserId
left join @UserBehavior ub on ub.UserId = ui.UserId
--left join @UserBehaviorDetails ubd on (ubd.Id=ub.Id and ubd.UserId=ub.UserId)
where username = 'user@email.com'
and ub.Id is not null
group by o.Organization_Name,ui.DisplayName,ui.NumLogins

1 Ответ

3 голосов
/ 30 апреля 2019

Вы считаете разные значения для ub.Id, но вы также группируете по тому же столбцу.

Вам необходимо удалить ub.Id из списка столбцов и GROUP BY, чтобы получить правильные агрегаты. Вам также не нужен DISTINCT при использовании GROUP BY.

SELECT 
    o.Organization_Name,
    ui.DisplayName, 
    ui.NumLogins, 
    COUNT(uw.Title) Assigned,
    SUM(CASE WHEN uw.Status IS NULL THEN 1 ELSE 0 END) NotStarted,
    SUM(CASE WHEN uw.Status = 'incomplete' THEN 1 ELSE 0 END) InProgress,
    SUM(CASE WHEN uw.grade >=80 THEN 1 ELSE 0 END) Completed,
    COUNT(DISTINCT ub.Id) ShouldBe84a,
    SUM(CASE WHEN ub.Id > 0 THEN 1 ELSE 0 END) ShouldBe84b
FROM @Organizations o
INNER JOIN @UserInfo ui on ui.OrgId = o.OrgId
LEFT JOIN @UserWorkshop uw on uw.UserId = ui.UserId
LEFT JOIN @UserBehavior ub on ub.UserId = ui.UserId
WHERE username = 'user@email.com'
AND ub.Id IS NOT NULL
GROUP BY o.Organization_Name,
        ui.DisplayName,
        ui.NumLogins;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...