Объединение таблиц, включая строки, в которых нет записи - SUM () - PullRequest
1 голос
/ 23 мая 2011

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

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

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

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

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

Ответы [ 6 ]

6 голосов
/ 23 мая 2011
select
  CL.ID,
  CL.FirstName,
  CL.LastName,
  coalesce(CO.SumAmount, 0) as [SUM(Amount)]
from tblClient as CL
  left outer join
    (
      select
        sum(Amount) as SumAmount,
        ID
      from tblComplete
      group by ID
    ) as CO
    on CL.ID = CO.ID
3 голосов
/ 23 мая 2011

SQL Server:

Вы начинаете свой оператор с выбора из 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
1 голос
/ 08 июня 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
1 голос
/ 23 мая 2011

Попробуйте с тем, чтобы присоединиться?

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
1 голос
/ 23 мая 2011

Простой ответ, используйте OUTER JOIN или LEFT JOIN (поскольку LEFT JOINS являются внешними для начала с ..)

См. Также: http://en.wikipedia.org/wiki/Join_(SQL)#Outer_joins

Ключевое слово external make включает includeстроки, даже если они не имеют записи в обеих таблицах.ВЛЕВО или ВПРАВО - это действительно то, на какой стороне = находится таблица с нулевым значением.

1 голос
/ 23 мая 2011
select a.ID,a.FirstName,a.LastName, sum(b.Amount)  from tblClient a , tblComplete b where a.ID = b.ID group by b.ID
...