表连接包括没有条目的行 - SUM()

时间:2011-05-23 05:30:15

标签: sql sql-server tsql sql-server-2000 aggregate-functions

我在将两个表连接在一起时遇到了一些困难,涉及一个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

我希望Super Man被包含在输出中,总和为零,因为他没有购买任何东西。我该怎么做呢?

编辑:tblComplete表中的主键。

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

SQL Server:

使用tblClient中的select来启动语句,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

答案 2 :(得分:1)

select a.ID,a.FirstName,a.LastName, sum(b.Amount)  from tblClient a , tblComplete b where a.ID = b.ID group by b.ID

答案 3 :(得分:1)

简单回答,使用OUTER JOIN或LEFT JOIN(因为LEFT JOINS在外面开始...)

查看更多:http://en.wikipedia.org/wiki/Join_(SQL)#Outer_joins

关键字outer make包含行,即使它们在两个表中都没有记录。 LEFT或RIGHT实际上只是=无效表的哪一侧。

答案 4 :(得分:1)

尝试使用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

答案 5 :(得分:1)

Using Aggregate Functions in the Select List

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