2015-06-23 49 views
1

我已经尝试了许多我在这里找到的脚本,但没有做到我所需要的。获取发票付款总额和每个客户欠款

我有3个表格:clients,invoicedpayments

我想:

  • 和每个客户端的所有发票的日期范围内
  • 总和为客户支付所有在该日期范围内,那么减去已开具发票的付款表现出量突出。

我需要添加日期范围,并获得总数,如果不是零。

到目前为止,我的查询是

select id, 
    (select sum(Total) from invoiced where invoiced.ClientId = clients.Id) AS Invoiced, 
    (select sum(Amount) from payments where payments.ClientId = clients.Id) AS Paid 
FROM clients 
+1

显示DB模式为好,不明确的日期范围将在该日期字段 – Girish

回答

0

问题是发票和付款之间的非现有关系。 这使得它有点“脏”;)

试试这个:

select p.id, sum(i.total), sum(p.amount), sum(i.total) - sum(p.amount) as outstanding 
from 
(
select c.id, coalesce(pay.amount,0) as amount 
from 
    (select ClientId, Sum(Amount) amount from payments group by ClientId) as pay 
    right join clients c on c.id = pay.ClientId 
) p 
left join 
(
select c.id, inv.total 
from 
    (select ClientId, Sum(Total) total from invoiced group by ClientId) as inv 
    left join clients c on c.id = inv.ClientId 
) i 
on p.id = i.id 
group by id 
having sum(i.total) <> sum(p.amount) 
; 

更新Sqlfiddle with results here

+0

有应用没有显示发票的第三栏 - 付费。你会如何建议在一张表格中建立关系,该表格包含反映一个月内完成的特殊工作的记录,以及专为该工作完成的付款? – David

+0

通常您使用发票(发票号码)进行付款,对吗?...但付款金额不得与发票中指定的金额相同,有些金额低于发票金额。无论如何,我确实尝试了sqlfiddle,结果应该是David要求的。 – MrSimpleMind

+0

谢谢你的作品。如果我只想显示非零余额?关于你的关系评论。发票表更准确地是一份工作表。这是发票发行前完成的所有工作。但是,由于客户每工作一次付款,他们在一个月内就可以得到多张发票,所以他们应该按发票结算,但有些只在月末支付。 – David