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))与到期信用卡相同