MS SQL:每个结果的表计算

MS SQL:每个结果的表计算,sql,sql-server,Sql,Sql Server,我想在数据库中计算客户的“余额” Customer Table ----------------- 1 - Frank 2 - Bob Invoice Table --------------------------------------------------- id | customer_id | amount_due | credit_due --------------------------------------------------- 1 | 1 | $

我想在数据库中计算客户的“余额”

Customer Table
-----------------
1 - Frank
2 - Bob

Invoice Table
---------------------------------------------------
id | customer_id | amount_due | credit_due
---------------------------------------------------
1  | 1           | $10        | 
---------------------------------------------------
2  | 1           |            | $6
---------------------------------------------------
下面是一个用于查找客户信息的典型sql语句

SELECT id, name FROM CUSTOMER WHERE id = ?
如果我还想找回余额,我会这样做:

SELECT a.*, b.* FROM 
(SELECT id, name FROM CUSTOMER WHERE id = ?) AS a, 
(SELECT SUM(amount_due - credit_due) AS balance FROM INVOICE WHERE cus_id = ?) AS b
运行此结果:

--------------------
id | name | balance 
---------------------
1 | Frank | $4
这在只检索一个客户时非常有效,但如果我想进行更全面的搜索,该怎么办?像加载所有客户

这是我想要得到的输出

--------------------
id | name | balance 
---------------------
1 | Frank | $4
---------------------
2 | Bob   | $0

我认为,您可以使用聚合:

select c.customer_id, c.name,
       ( coalesce(sum(i.amount_due), 0) - coalesce(sum(i.credit_due), 0) ) as balance
from customer c join
     invoice i
     on i.customer_id = c.customer_id
group by c.customer_id, c.name;

我应该注意,如果amount字段为
NULL
,那么表达式
sum(amount\u due-credit\u due)
并没有达到您预期的效果。

您应该使用聚合,我认为:

select c.customer_id, c.name,
       ( coalesce(sum(i.amount_due), 0) - coalesce(sum(i.credit_due), 0) ) as balance
from customer c join
     invoice i
     on i.customer_id = c.customer_id
group by c.customer_id, c.name;

我应该注意,如果amount字段为
NULL
,那么表达式
sum(amount\u due-credit\u due)
就没有达到您的预期效果。

这不是一个左连接吗?在我的“实际”代码中,我使用ISNULL()捕捉NULL总和,只返回$0,您还应该
合并
I.amount\u due
。。不是
总和
sum(coalesce(i.amount\u due,0))
credit\u due
相同,这不应该是一个左连接吗?在我的“实际”代码中,我使用ISNULL()捕捉空和,只返回$0,你还应该
coalesce
i.amount\u due
。。不是
总和
<代码>金额(合并(即到期金额,0))与
到期信用卡相同