Sql server 获取付款总额减去收到的金额

Sql server 获取付款总额减去收到的金额,sql-server,tsql,group-by,common-table-expression,Sql Server,Tsql,Group By,Common Table Expression,我有两张桌子 1.发票 invoice_Id invoice_no client_id date total_price ----------------------------------------------------------------------------- 2 INV00001 9 2014-10-15 200.00 7 INV00002 9 20

我有两张桌子

1.发票

invoice_Id  invoice_no  client_id   date        total_price    
-----------------------------------------------------------------------------
2           INV00001    9           2014-10-15  200.00   
7           INV00002    9           2014-10-16  560.00   
8           INV00003    9           2014-10-21  100.00   
11          INV00004    9           2014-10-27  101.00   
2.发票和付款

InvPayment_id   client_id   Invoice_Id  receipt_no  payment_date    amount_received discount
--------------------------------------------------------------------------------------------
6               9           8           REC00002    2014-10-31      5.00            0.00
现在我想通过合计发票金额并减去收到的任何金额来获得客户应付的总金额

预期结果:

client_id   Total_price    Due_Amount
-----------------------------------------------------------------------------
9           961.00         956.00
注:

  • 如果到目前为止没有付款,则将没有行
  • 如果接受多个付款,则可能有多行
  • 以下是我尝试过的:

    ;WITH cte (clientid, invoiceid,  paid, disc)
    As
    (
        Select client_id clientId, invoice_Id invoiceId,  sum(amount_received) paid, sum(discount) disc
        From tbl_Invoice_Payment
        Group by invoice_id, client_id
    )
    Select I.client_id, invoice_Id, invoice_no, I.due_date
    ,SUM(I.total_price), Isnull(SUM(paid), 0) Paid, (SUM(Total_price) - Isnull(SUM(paid),0) - Isnull(SUM(disc),0)) Balance
    --,I.total_price, Isnull(paid, 0) Paid, (Total_price - Isnull(paid,0) - Isnull(disc,0)) Balance
    From tbl_invoice I Left join cte On I.client_id = cte.clientId 
            And I.invoice_id = cte.invoiceid
            left join tbl_client C on C.client_id = I.client_id
    group by I.client_id, invoice_Id, invoice_no, due_date, account_type, company_name, total_price, paid, disc
    order by company_name
    

    但是它没有按预期工作。

    您可以简单地添加子查询以返回支付结果,并从总额中减去该值,而不是使用CTE:

    架构设置

    CREATE TABLE Invoice
        ([invoice_Id] int, [invoice_no] varchar(8), [client_id] int, 
         [date] datetime, [total_price] decimal(5,2));
    
    INSERT INTO Invoice
        ([invoice_Id], [invoice_no], [client_id], [date], [total_price])
    VALUES
        (2, 'INV00001', 9, '2014-10-15 00:00:00', 200.00),
        (7, 'INV00002', 9, '2014-10-16 00:00:00', 560.00),
        (8, 'INV00003', 9, '2014-10-21 00:00:00', 100.00),
        (11, 'INV00004', 9, '2014-10-27 00:00:00', 101.00);
    
    CREATE TABLE Invoice_Payment
        ([InvPayment_id] int, [client_id] int, [Invoice_Id] int, [receipt_no] varchar(8), 
         [payment_date] datetime, [amount_received] decimal(5,2), [discount] int);
    
    INSERT INTO Invoice_Payment
        ([InvPayment_id], [client_id], [Invoice_Id], [receipt_no], [payment_date], 
         [amount_received], [discount])
    VALUES
        (6, 9, 8, 'REC00002', '2014-10-31 00:00:00', 5.00, 0.00);
    
    查询以生成输出:

    SELECT  i.client_id , SUM(i.total_price) AS Total_price,
            SUM(i.total_price) - ( SELECT   SUM(ip.amount_received)
                                   FROM     dbo.Invoice_Payment ip
                                   WHERE    i.client_id = ip.client_id
                                 ) AS DueAmount
    FROM    dbo.Invoice i
    WHERE   client_id = 9
    GROUP BY client_id
    
    | CLIENT_ID | TOTAL_PRICE | DUEAMOUNT |
    |-----------|-------------|-----------|
    |         9 |         961 |       956 |
    

    SELECT  i.client_id , SUM(i.total_price) AS Total_price,
            SUM(i.total_price) - ( SELECT   SUM(ip.amount_received)
                                   FROM     dbo.Invoice_Payment ip
                                   WHERE    i.client_id = ip.client_id
                                 ) AS DueAmount
    FROM    dbo.Invoice i
    WHERE   client_id = 9
    GROUP BY client_id
    
    | CLIENT_ID | TOTAL_PRICE | DUEAMOUNT |
    |-----------|-------------|-----------|
    |         9 |         961 |       956 |
    

    请选择所需的值。这个问题与分组有关


    分组依据
    条款
    客户id
    发票id
    发票编号
    到期日
    账户类型
    公司名称
    总价
    已付
    光盘
    ,指定了这么多字段<代码>发票Id,
    发票编号
    阻止您需要的分组。从
    中删除
    invoice\u Id
    invoice\u no
    ,然后选择
    分组依据
    ,然后重试。

    太好了。查询中有一些修改,但我已使其正常工作。谢谢