我正在尝试获取与每个客户关联的所有行的总和并加入它们。
但是我发现如果不存在任何行,它会完全抛弃客户。
如果总和为零,我更愿意。我将如何实现这一目标。
这是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,如果重要。
答案 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