Соединение 3 таблиц с критериями «Где» - PullRequest
1 голос
/ 21 марта 2012

Я новичок в SQL, и я столкнулся с проблемой при объединении 3 таблиц.

У меня есть 3 таблицы

1) USER_MASTER (идентификатор пользователя, fname, lname) Это таблица агента колл-центра

2) CALL_MASTER (callid, имя клиента, телефон, идентификатор пользователя, тип вызова) это где звонки клиентов идут, идентификатор пользователя используется, чтобы связать, какой агент принял вызов, тип вызова является результатом вызова

3) CALL_TYPE_MASTER as

calltype typename
1        transferred
2        routed
3        disconnected

Я хочу перечислить это так

Agent name           Transferred    routed  disconnected
Balang Hector           7          1          2
Bonus Donna             0          1          2
Dalino Marie            8          1          1
Dela Cruz               0          0          1

Я пробовал этот запрос:

SELECT
USER_MASTER.FirstName,COUNT(CALL_MASTER.CallType) as Transferred 
FROM
(USER_MASTER LEFT JOIN CALL_MASTER ON CALL_MASTER.UserID=USER_MASTER.USERID) 
WHERE
CALL_MASTER.CallType=1
GROUP BY
USER_MASTER.FirstName

Но проблема в том, что мне нужно перечислить еще одну строку как "перенаправленную" и "перенесенную", но это будет означать изменение предложения where, и оно, очевидно, не выведет "0", если он не найден.

1 Ответ

3 голосов
/ 21 марта 2012

Это, конечно, довольно стандартный PIVOT запрос. Вот более идиоматическая версия для SQL Server:

SELECT User_Master.name, [1] AS Transferred, [2] AS Routed, [3] AS Disconnected
FROM (SELECT userId, callType
      FROM Call_Master) Call_Master
PIVOT(COUNT(callType) FOR callType IN ([1], [2], [3])) Pivoted
JOIN User_Master
  ON User_Master.userId = Pivoted.userId

Демонстрация SQL Fiddle

Агрегат, кажется, происходит до объединения с User_Master, поэтому запрос должен иметь возможность использовать индексы для выполнения COUNT(*). К сожалению, нет способа автоматически заполнять псевдонимы столбцов - для этого вам понадобится динамический SQL.


EDIT:

Пояснения -

(SELECT userId, callType
 FROM Call_Master) Call_Master

Этот подзапрос получает список столбцов, по которым будет группироваться и запускаться агрегат. Вы можете сделать любые условия для проверки диапазона и тому подобное. Намерение состоит в том, что запрос должен быть тем, что вы написали бы для GROUP BY ... просто без этого предложения и агрегата.

PIVOT(COUNT(callType) FOR callType IN ([1], [2], [3])) Pivoted

В этом разделе система сообщает "для предыдущей ссылки на таблицу, запустите данный агрегат по указанному столбцу и для каждого изменения в другом (потенциально другом) столбце поместите результат в новый столбец". Есть несколько предостережений:

  • Все остальные столбцы будут включены в то, что по существу составляет GROUP BY пункт
  • Вы можете указать только одну статистическую функцию
  • Вы можете указать только один столбец в совокупности и только столбец (здесь нет математики). Вам нужно сделать что-то подобное в подзапросе
  • Список столбцов в предложении IN должен содержать все значения, возвращаемые вашим подзапросом, но также может иметь столбцы без результатов. Если вы пропустите [2], вы получите ошибку во время выполнения, но добавление [4] просто даст вам столбец с 0 s
  • Обязательные скобки, и если столбец, указанный в предложении FOR, является символьным, вы не используете кавычки вокруг значений.
  • Псевдоним для таблицы результатов (Pivoted здесь) является обязательным и действует для всех столбцов. На данный момент в запросе нет столбца Call_Master.userId.

    ПРИСОЕДИНЯЙТЕСЬ к User_Master ON User_Master.userId = Pivoted.userId

... И, наконец, соединение с User_Master для перевода идентификаторов пользователей в имена. Обратите внимание: поскольку агрегат происходит «внутри» ссылки, сгенерированной как часть запроса Pivot, вам не нужно беспокоиться о странных вещах, происходящих с остальными данными.

...