我有3个表,我试图加入在一起,并得到总和.

发票 发票项目 付款

一张发票可以有多个项目.我可以把这些加在一起,得到正确的总和.

发票也可以有多个付款,这就是问题所在.付款表行似乎重复并返回错误的总额.

invoices

id discount_rate
40 0.25
41 0.25
42 0.1

invoice_items

invoice_id qty cost vat_rate
Cell 1 Cell 2 Cell 2 Cell 2
Cell 3 Cell 4 Cell 2 Cell 2

我已经成功地连接了这两个表,并获得了正确的结果:

SELECT 
    invoices.id,
    SUM((qty * cost - cost * qty * discount_rate) * vat_rate) + SUM(cost * qty) - SUM(cost * qty * discount_rate) final
FROM
    invoices
        JOIN
    invoice_items ON invoices.id = invoice_items.invoice_id
GROUP BY invoice_id;

enter image description here

当我将Payments(一个发票可以有多个付款)表加入它时,问题就开始了. 付款

payments

invoice_id amount
Cell 1 Cell 2
Cell 3 Cell 4

Payments table with data: enter image description here

-你在说什么?

with 
paymentSumAggr as (
select invoice_id, sum(amount) as paymentSum from payments
group by invoice_id
)

select      
invoices.id,
    SUM((qty * cost - cost * qty * discount_rate) * vat_rate) + SUM(cost * qty) - SUM(cost * qty * discount_rate) final,
    sum(p_sum.paymentSum) as payments_sum
from
invoices
        left join
    invoice_items ON invoices.id = invoice_items.invoice_id
    left join (select * from paymentSumAggr) as p_sum on invoices.id = p_sum.invoice_id
    group by invoices.id

Result from query: enter image description here

我try 过以许多不同的方式连接这些应用程序,还try 了子查询和分组.

推荐答案

由于您已经对每张发票的付款进行了汇总,因此不需要再次汇总.请try 以下查询:

with 
paymentSumAggr as (
select invoice_id, sum(amount) as paymentSum from payments
group by invoice_id
)

select      
invoices.id,
    SUM((qty * cost - cost * qty * discount_rate) * vat_rate) + SUM(cost * qty) - SUM(cost * qty * discount_rate) final,
    p_sum.paymentSum as payments_sum
from
invoices
        left join
    invoice_items ON invoices.id = invoice_items.invoice_id
    left join paymentSumAggr as p_sum on invoices.id = p_sum.invoice_id
    group by invoices.id

Mysql相关问答推荐

使用触发器markdown 10%

可以优化这个带有重复WHERE子句的查询吗?

在MySQL中查找包含无效正则表达式的行

从表中 Select 具有不同顺序的列

查找表中的唯一记录

特定时间段内每个客户的运行总计

看不懂mysql自左连接查询

完全匹配 IN 子句中的所有值

如何使用减号运算符编写 sql 查询以返回缺少相应值的行?

如何使用 DBD::mysql 判断 MySQL 服务是否正在运行

使用适配器设计模式和外观设计模式实现

如何知道 Select 查询花费了多少时间?

MySQL查询根据同一表中其他字段的值更新表中的字段

MySQL 视图

MySQL PHP - Select WHERE id = array()?

不正确的整数(2147483647)被插入到 MySQL 中?

默认为空字符串的列

MySQL - 基于同一表中的行求和列值

MySQL - 重复表

在 MySQL 中仅 Select 仅包含字母数字字符的行