Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Два джойна  [new]
eXeLe
Member

Откуда:
Сообщений: 65
Есть три таблицы - Пользователи, предприятия, список заданий.
У пользователя указано его предприятие, у задания указано, кто - пользователь.

Для начала сделал три поля по следующему запросу - вывести предприятия, к которым приписаны пользователи, ID предприятия и кол-во пользователей у данного предприятия:
SELECT u.ORG_ID, o.ORG_NAME, COUNT(u.USR_ID)
FROM usr u
INNER JOIN organization o ON o.CONTRAGENT_ID=u.CONTRAGENT_ID
GROUP BY o.ORG_NAME, u.ORG_ID


Теперь нужно как то добавить по предприятиям сумму заданий, выполненных их пользователями.
Пробую так, как показано ниже, поле показывает верное значение, но вместе с тем и поле COUNT(u.USR_ID) начинает показывать точно такое же значение, вместо кол-ва пользователей.
SELECT u.ORG_ID, o.ORG_NAME, COUNT(u.USR_ID), COUNT(t.TASK_ID)
FROM usr u
INNER JOIN organization o ON o.CONTRAGENT_ID=u.CONTRAGENT_ID
INNER JOIN task t ON t.USER_ID = u.USR_ID
GROUP BY o.ORG_NAME, u.ORG_ID
23 ноя 12, 10:58    [13517613]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
Glory
Member

Откуда:
Сообщений: 104760
COUNT(DISTINCT u.USR_ID)
23 ноя 12, 11:01    [13517633]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
Glory
Member

Откуда:
Сообщений: 104760
eXeLe
начинает показывать точно такое же значение, вместо кол-ва пользователей.

count вообще то всегда счиает число записей
23 ноя 12, 11:02    [13517637]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
eXeLe
Member

Откуда:
Сообщений: 65
Glory,

да, но в первом примере у нас успешно считается кол-во строк с пользователями по предприятию (т.е. кол-во пользователей для каждого предприятия, у которого вообще есть пользователи). и делается это успешно.
но когда добавляем второй COUNT, который сам по себе тоже показывает нужную инфу, то первый COUNT с кол-вом пользователей начинает показывать точно такую же инфу, что и второй COUNT (кол-во заданий)

а DISTINCT вроде нужен для фильтрации дублей, так что тут не в тему, видимо я некорректно выразил свою проблему.
23 ноя 12, 11:06    [13517672]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
Glory
Member

Откуда:
Сообщений: 104760
eXeLe
да, но в первом примере у нас успешно считается кол-во строк с пользователями по предприятию (т.е. кол-во пользователей для каждого предприятия, у которого вообще есть пользователи). и делается это успешно.
но когда добавляем второй COUNT, который сам по себе тоже показывает нужную инфу, то первый COUNT с кол-вом пользователей начинает показывать точно такую же инфу, что и второй COUNT (кол-во заданий)

Наверное потому, что число записей поменялось ?
А поменялось оно не из-за "вторго count", а из-за второй таблицы.
23 ноя 12, 11:11    [13517711]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
Glory
Member

Откуда:
Сообщений: 104760
eXeLe
а DISTINCT вроде нужен для фильтрации дублей, так что тут не в тему, видимо я некорректно выразил свою проблему.

Вы бы хоть открывали хелп и читали, что делает тот или иной параметер функций.
23 ноя 12, 11:11    [13517715]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
eXeLe
Member

Откуда:
Сообщений: 65
Glory,

да, из-за чего чего оба каунта одинаковых - понял.
когда присоединена вторая таблица с DISTINCT все равно показываются некорректные данные. другие, но они меньше, чем нужно и отличаются от тех, когда второй таблицы нет
23 ноя 12, 11:21    [13517795]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
eXeLe
Member

Откуда:
Сообщений: 65
делаю просто COUNT(DISTINCT u.USR_ID)
когда у нас объединено две таблицы, он показыает одно число, когда добавляем третью, становится меньше.
23 ноя 12, 11:27    [13517849]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
Glory
Member

Откуда:
Сообщений: 104760
eXeLe
когда у нас объединено две таблицы, он показыает одно число, когда добавляем третью, становится меньше.

И что тут неправильного ?
Вы опять забыли, что COUNT считает число записей в _результате запроса_
А не по таблице.
23 ноя 12, 11:29    [13517873]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
COUNT(выражение) считает количество записей, для которых выражение IS NOT NULL. Имя поля - всего лишь частный случай выражения.
COUNT(*) считает количество всех записей

Чтобы понять, что же считает агрегатная функция, надо её просто убрать из запроса вместе с GROUP BY
и посмотреть глазами на "сырые" данные, которые подсчитываются.
23 ноя 12, 11:42    [13517986]     Ответить | Цитировать Сообщить модератору
 Re: Два джойна  [new]
eXeLe
Member

Откуда:
Сообщений: 65
поменял джоин второй таблицы на LEFT OUTER JOIN, теперь работает нормально.
23 ноя 12, 11:43    [13517990]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить