SQL 2个求和给予了不正确的结果

问题描述:

Im做一个查询在那里我做2个求和,但它发出了一种怪异的结果SQL 2个求和给予了不正确的结果

SELECT 
    SUM(Details.price * Details.quantity) AS total_amount, 
    SUM(Payment.amount_paid) as paid_amount 
FROM 
    Details, 
    Invoice 
LEFT JOIN 
    Payment ON Invoice.id = Payment.fk_invoice_id 
WHERE 
    AND Invoice.id = 1 
    AND Invoice.id = Details.fk_invoice_id 
GROUP BY Details.fk_invoice_id; 

什么是目前发生的事情是可以说有在支付3行相匹配的选择标准并且只有1个细节,total_amount中的总和乘以3,但是paid_amount是正确的。然后让我们说明细节中有2项与条件相符,付款方式为1,paid_amount乘以2,但total_amount是正确的。任何提示都会很棒,谢谢!

架构

Invoice 
    id 
    Name.... 


Details 
    id 
    fk_invoice_id 
    name 
    price 
    quantity 

Payment 
    id 
    fk_invoice_id 
    amount_paid 

更多细节:

我正在努力简化我的职位,但只是添加

客户有许多发票

我只能是一个参考给客户,所以customer.id是发票中的外键,即时尝试获取特定客户的所有发票。

所有你想要做的就是从细节和东西从发票付款的东西。但你正在加入所有相关记录。所以说,有3个详细记录和发票,那么你乘以2的详细结果2条的缴费记录,并通过3.付款结果您可以鸿沟:

SELECT 
    SUM(Details.price * Details.quantity)/GREATEST(COUNT(DISTINCT Payment.id),1) AS total_amount, 
    SUM(Payment.amount_paid)/COUNT(DISTINCT Details.id) as paid_amount 
FROM Details 
JOIN Invoice ON Invoice.id = Details.fk_invoice_id AND Invoice.id = 1 
LEFT JOIN Payment ON Invoice.id = Payment.fk_invoice_id 
GROUP BY Invoice.id; 

或者干脆不参加什么切不可加入。这里有一种方法:

SELECT 
    (SELECT SUM(Details.price * Details.quantity) FROM Details WHERE Details.fk_invoice_id = Invoice.id) AS total_amount, 
    (SELECT SUM(Payment.amount_paid) FROM Payment WHERE Payment.fk_invoice_id = Invoice.id) AS paid_amount 
FROM Invoice 
WHERE id = 1; 

这里是另一个,其中前加入聚合完成。 (我们不需要发票表无论如何,顺便说一句,我在这里将其删除。)

SELECT 
    d.total_amount, 
    p.paid_amount 
FROM 
(
    SELECT fk_invoice_id, SUM(price * quantity) as total_amount 
    FROM Details 
    GROUP BY fk_invoice_id 
) d ON d.fk_invoice_id = Invoice.id 
LEFT JOIN 
(
    SELECT fk_invoice_id, SUM(Payment.amount_paid) as paid_amount 
    FROM Payment 
    GROUP BY fk_invoice_id 
) p ON p.fk_invoice_id = Invoice.id 
WHERE d.fk_invoice_id = 1; 

只要你只是寻找一个发票号,所有上述语句可以simplyfied当然。例如:

SELECT 
    (SELECT SUM(Details.price * Details.quantity) FROM Details WHERE Details.fk_invoice_id = 1) AS total_amount, 
    (SELECT SUM(Payment.amount_paid) FROM Payment WHERE Payment.fk_invoice_id = 1) AS paid_amount;