SQL-союз с функцией COUNT () не возвращает ожидаемых результатов - PullRequest
2 голосов
/ 21 января 2012

Я пытаюсь вернуть всех пользователей MSFT Lync, которые использовали голосовую конференцию, и количество раз, когда они ее использовали.Я должен использовать UNION, потому что таблица содержит User1 и User2, которые оба участвовали в конференции, которую я хочу, в одном столбце.

Вот SQL:

SELECT U.UserUri,
       COUNT(U.UserUri) AS COUNT
FROM   SessionDetails AS S
       INNER JOIN Users U
         ON S.User1Id = U.UserId
WHERE  MediaTypes = 48
GROUP  BY U.UserUri
UNION
SELECT U.UserUri,
       COUNT(U.UserUri) AS COUNT
FROM   SessionDetails AS S
       INNER JOIN Users U
         ON S.User2Id = U.UserId
WHERE  MediaTypes = 48
GROUP  BY U.UserUri  

Возвращенные результаты имеютлюбой, кто участвовал в более чем одной конференции, появляется в списке дважды, с двумя итоговыми значениями.На самом деле, после ввода это должно быть группирование по User1Id и User2ID.Если у человека было 9 разговоров, но он инициировал только 6 из них, он был бы User1 6 раз и User2 3 раза, создавая две разные группировки.

Теперь я знаю почему, но есть идеи, как вернуть дубликат UserUri?Любая помощь с благодарностью!

1 Ответ

5 голосов
/ 21 января 2012

Есть ли агрегат после СОЮЗА?

SELECT
    T.UserUri, COUNT(*)
FROM
    (
    SELECT U.UserUri
    FROM   SessionDetails AS S
           INNER JOIN Users U
             ON S.User1Id = U.UserId
    WHERE  MediaTypes = 48
    UNION ALL
    SELECT U.UserUri
    FROM   SessionDetails AS S
           INNER JOIN Users U
             ON S.User2Id = U.UserId
    WHERE  MediaTypes = 48
    ) T
GROUP BY 
   T.UserUri

Редактировать: исправлены псевдонимы, добавлено ВСЕ в UNION

...