Соединение таблиц, включая строки, в которых нет записи - SUM()

У меня возникли небольшие трудности с объединением двух таблиц вместе с SUM, которые не включены во вторую таблицу.

т.е. У меня есть две таблицы:

tblClient

 ID|FirstName|LastName
 1 |Billy    |Blogs
 2 |Bobby    |Biggs
 3 |Hill     |Bill
 4 |Super    |Man

tblComplete

 PurchaseID|ID|Amount
 123123    |1 |26.00
 43254     |2 |22.00
 546275    |3 |15.00
 463565    |3 |15.00
 343252    |1 |56.00

Я хотел бы объединить эти две таблицы вместе, чтобы получить результат:

 ID|FirstName|LastName| SUM(Amount)
 1 |Billy    |Blogs   | 82.00
 2 |Bobby    |Biggs   | 22.00
 3 |Hill     |Bill    | 30.00
 4 |Super    |Man     | 0

Я хотел бы, чтобы Супермен был включен в вывод с нулевой суммой, потому что он ничего не покупал. Как мне это сделать?

РЕДАКТИРОВАТЬ: первичный ключ в таблице tblComplete.


person itwb    schedule 23.05.2011    source источник


Ответы (5)


SQL-сервер:

Вы начинаете свой оператор с выбора из tblClient, который содержит одну запись для каждой записи в вашем выводе. Затем вы LEFT JOIN выполняете группировку по ClientID и используете совокупность функция SUM(), которая вызывает суммирование сумм каждого клиента (если они вообще существуют).

SELECT
  CLIENT.ID, 
  CLIENT.FirstName, 
  CLIENT.LastName, 
  Sum(ISNULL(COMP.Amount, 0)) as Sum 
FROM 
  tblClient as CLIENT 
  LEFT JOIN tblComplete as COMP on COMP.ID = CLIENT.ID 
GROUP BY 
  CLIENT.ID, 
  CLIENT.FirstName, 
  CLIENT.LastName
person Brian Webster    schedule 23.05.2011

Простой ответ: используйте ВНЕШНЕЕ СОЕДИНЕНИЕ или ЛЕВОЕ СОЕДИНЕНИЕ (поскольку ЛЕВЫЕ СОЕДИНЕНИЯ изначально являются внешними..)

Подробнее: http://en.wikipedia.org/wiki/Join_(SQL)#Outer_joins

Ключевое слово external позволяет включать строки, даже если они не имеют записей в обеих таблицах. LEFT или RIGHT - это просто то, на какой стороне = находится таблица с нулевым значением.

person colinross    schedule 23.05.2011

Попробуйте LEFT JOIN?

SELECT
    tblClient.*,
    SUM(tblComplete.amount) as Amount
FROM
    tblClient
LEFT JOIN
    tblComplete ON tblClient.ID = tblComplete.ID
GROUP BY
    tblClient.id

Если это не работает (я его не выполняю), попробуйте:

SELECT
    tblClient.*,
    IF(COUNT(tblComplete.*), SUM(tblComplete.amount), 0) as Amount
FROM
    tblClient
LEFT JOIN
    tblComplete ON tblClient.ID = tblComplete.ID
GROUP BY
    tblClient.id
person Exos    schedule 23.05.2011

Использование агрегатных функций в списке выбора

SELECT
  CLIENT.ID, 
  CLIENT.FirstName, 
  CLIENT.LastName, 
  Sum(ISNULL(COMP.Amount, 0)) as Sum
FROM 
  tblClient as CLIENT 
  LEFT JOIN tblComplete as COMP on COMP.ID = CLIENT.ID 
GROUP BY 
  CLIENT.ID, 
  CLIENT.FirstName, 
  CLIENT.LastName

OR

SELECT
  CLIENT.ID, 
  CLIENT.FirstName, 
  CLIENT.LastName, 
  Sum(ISNULL(COMP.Amount, 0)) as Sum 
FROM 
  tblClient as CLIENT 
  Inner JOIN tblComplete as COMP on COMP.ID = CLIENT.ID 
GROUP BY 
  CLIENT.ID, 
  CLIENT.FirstName, 
  CLIENT.LastName
person Pankaj    schedule 08.06.2011

person    schedule
comment
+1 за вынесение объединения за рамки вычислений sum() и за цитирование вещей, которые могут быть восприняты как ключевые слова... - person pilcrow; 23.05.2011