代码之家  ›  专栏  ›  技术社区  ›  Jack Skeletron

T-SQL三表求和

  •  2
  • Jack Skeletron  · 技术社区  · 7 年前

    我创建了一个SQLFIDLE http://www.sqlfiddle.com/#!18/b9363f/4 来解释我的问题

    我有三个实体“发票”->1: n->“付款”->1: n->“获取”

    每个实体都有自己的合计(金额),我必须写一个选择,将(每个实体的)金额相加,以匹配父实体的ampount。。。问题在于每次拍摄都会收到多少“付款”。

    SELECT I.invoice_number AS invoiceNumber, I.amount AS invoiceAmount, SUM(P.amount) AS paymentAmount, SUM(T.amount) as takingAmount 
    FROM Invoice AS I
    INNER JOIN Payment AS P ON P.invoice_number = I.invoice_number
    INNER JOIN Taking AS T ON T.invoice_number = P.invoice_number AND T.payment_row = P.payment_row
    GROUP BY I.invoice_number, I.amount, P.invoice_number
    

    结果是(第一行错误)

    invoiceNumber   invoiceAmount   paymentAmount   takingAmount
    1               100.2           300.4           100.2
    2               98.4            98.4            98.4
    

    我如何将此项分组以避免“回复”付款的“金额”

    [已编辑] 预期结果

    invoiceNumber   invoiceAmount   paymentAmount   takingAmount
    1               100.2           100.2           100.2
    2               98.4            98.4            98.4
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Joe Taras    7 年前

    您必须编写包含两个子查询的查询,以计算付款和接受金额。

    您的查询将是:

     SELECT I.invoice_number, SUM(I.amount),
         (SELECT SUM(P.amount)
         FROM Payment P
         WHERE P.invoice_number = I.Invoice_number) as Payment_Amount,
         (SELECT SUM(T.amount)
         FROM Taking T
         WHERE T.invoice_number = I.Invoice_number) as Taking_Amount
     FROM Invoice I
     group by I.invoice_number
    

    这里是 Sql Fiddle

        2
  •  0
  •   Yogesh Sharma    7 年前

    使用 apply 操作员:

    SELECT I.invoice_number AS invoiceNumber, I.amount AS invoiceAmount, 
           p.paymentAmount, t.takingAmount 
    FROM Invoice AS I cross apply (
        select SUM(amount) as paymentAmount
        from Payment 
        where invoice_number =  i.invoice_number
    ) p cross apply (
       select SUM(amount) as takingAmount
       from Taking as takingAmount
       where invoice_number =  i.invoice_number
    ) t;
    

    你的 joins 有一些冗余的过滤,所以会产生一致性和