从中选择总和

时间:2018-06-14 19:25:50

标签: sql sql-server

我正在尝试获取与每个客户关联的所有行的总和并加入它们。

但是我发现如果不存在任何行,它会完全抛弃客户。

如果总和为零,我更愿意。我将如何实现这一目标。

这是SQL语句:

SELECT 
    Id, DebitSum
FROM
    Customers
JOIN
    (SELECT 
         SUM(Amount) DebitSum, CustomerId
     FROM 
         Purchases
     WHERE 
         Completed IS NULL
     GROUP BY 
         CustomerId) p ON p.CustomerId = Id;

使用SQL Server,如果重要。

6 个答案:

答案 0 :(得分:2)

只需使用LEFT JOIN

SELECT c.Id, COALESCE(p.DebitSum, 0)
FROM Customers c LEFT JOIN
     (SELECT SUM(p.Amount) as DebitSum, p.CustomerId
      FROM Purchases p
      WHERE p.Completed IS NULL
      GROUP BY CustomerId
     ) p
     ON p.CustomerId = c.Id;

这通常是在没有子查询的情况下编写的:

SELECT c.Id, COALESCE(SUM(p.Amount), 0) as DebitSum
FROM Customers c LEFT JOIN
     Purchases p
     ON p.CustomerId = c.Id;
WHERE p.Completed IS NULL
GROUP BY c.Id

答案 1 :(得分:1)

您可以使用LEFT JOIN

SELECT Id, COALESCE(DebitSum,0) AS DebitSum
FROM Customers
LEFT JOIN (
            SELECT SUM(Amount) DebitSum, CustomerId
            FROM Purchases
            WHERE Completed IS NULL
            GROUP BY CustomerId
       ) p ON p.CustomerId = Id;

答案 2 :(得分:1)

试试这个:

SELECT Id, DebitSum
FROM Customers
LEFT JOIN (
            SELECT SUM(Amount) DebitSum, CustomerId
            FROM Purchases
            WHERE Completed IS NULL
            GROUP BY CustomerId
       ) p ON p.CustomerId = Id;

您正在进行JOIN,这意味着它必须存在于两个表/数据集中。将其更改为LEFT JOIN只需要它在First表中,而不是在LEFT JOIN之后的那个

答案 3 :(得分:1)

您也可以仅使用subquery

select id, (select coalesce(sum(p.Amount), 0) 
            from Purchases p 
            where p.CustomerId  = c.id and p.Completed IS NULL
            ) as DebitSum
from Customers c
group by id;

答案 4 :(得分:0)

SELECT SUM(Amount) DebitSum, CustomerId

信息后没有AS? select sum(amount) as debitsum, customerid

答案 5 :(得分:0)

试试这个 选择c.Id,COALESCE(p.DebitSum,0)作为DebitSum 来自客户c LEFT JOIN购买p  在c.Id = p.CustomerId 其中p.completed为null