【问题标题】:How to fix SUM when return duplicate row in MySQL在 MySQL 中返回重复行时如何修复 SUM
【发布时间】:2019-07-25 09:22:29
【问题描述】:

我正在尝试发出会产生一些 SUM 和 COUNT 的请求。但是由于重复的内部连接行,一些 SUM 行是错误的。我尝试了很多想法,但目前没有一个可行。

使用 INNER JOIN,当我在 invoiceRow 或 invoicePayment 上有多行时,发票行的总和为假(例如:如果我在 invoiceRow 上有 4 行,我将 Sum(invoice) 乘以 4)。

发票

id
customer
repertory
subTotal
totalPaid

客户

id
name

发票

id
invoice
type

发票付款

id
invoice
method
amount

如果有人可以帮助我,在此先感谢。

我已经尝试了一些SUM(DISTINCT),但它并没有像我想要的那样工作。

内连接的sql结果

SELECT DATE(i.endDate), 
c.currency,
ir.type,
ip.method, 
AVG(i.totalPaid), 
COUNT(DISTINCT i.repertory), 
COUNT(DISTINCT i.id), 
SUM(i.subTotal), 
SUM(i.totalPaid)
from invoice i 
INNER JOIN invoiceRow ir ON ir.invoice=i.id 
INNER JOIN invoicePayment ip ON ir.invoice=ip.invoice 
INNER JOIN customer c ON c.id=i.customer
where i.customer=21 and i.totalPaid is not null and ip.method IN (3)
GROUP BY DATE(i.endDate);

没有内部连接的结果

SELECT DATE(i.endDate),
c.currency, 
AVG(i.totalPaid), 
COUNT(DISTINCT i.repertory), 
COUNT(DISTINCT i.id), 
SUM(i.subTotal), 
SUM(i.totalPaid)
from invoice i 
INNER JOIN invoiceRow ir ON ir.invoice=i.id 
INNER JOIN invoicePayment ip ON ir.invoice=ip.invoice 
INNER JOIN customer c ON c.id=i.customer
where i.customer=21 and i.totalPaid is not null
GROUP BY DATE(i.endDate);

【问题讨论】:

    标签: mysql sql join sum


    【解决方案1】:

    客户应该是父级,因此当您使用 Sum() 时,它可以存在于带有连接的查询中。然而,InvoiceRow 和 InvoicePayment 似乎除了存在检查之外对结果没有任何贡献:

    SELECT DATE(i.endDate),
    c.currency, 
    AVG(i.totalPaid), 
    COUNT(i.repertory), 
    COUNT(i.id), 
    SUM(i.subTotal), 
    SUM(i.totalPaid)
    from invoice i 
    INNER JOIN customer c ON c.id=i.customer
    where i.customer=21 and i.totalPaid is not null AND
        exists (select * from invoiceRow ir 
            INNER JOIN invoicePayment ip ON ir.invoice=ip.invoice
            where ir.invoice=i.id)
    GROUP BY DATE(i.endDate), c.Currency;
    

    编辑:正如你所说,其他表中有字段,这是你应该如何处理它:

    SELECT DATE(i.endDate),
        c.currency, 
        AVG(i.totalPaid), 
        COUNT(i.repertory), 
        COUNT(i.id), 
        SUM(i.subTotal), 
        SUM(i.totalPaid),
        irp.Type, irp.Method
        from invoice i 
        INNER JOIN customer c ON c.id=i.customer
        inner join (select distinct i.id, ir.Type, ip.Method 
        from invoice inv
        inner join invoiceRow ir 
        INNER JOIN invoicePayment ip ON ir.invoice=ip.invoice
        where ir.invoice=inv.id)irp on irp.invoice = i.id
        where i.customer=21 and i.totalPaid is not null
        GROUP BY DATE(i.endDate), c.Currency, irp.Type, irp.Method;
    

    一般来说,在 InvoiceRow 和 InvoicePayment 上有类型和方法看起来很奇怪,我希望它们在标题上。

    【讨论】:

    • 感谢您的回答。但我需要选择 ir.type 和 ip.method 才能在 DTT (ajax) 上显示它们,这就是我使用 join 的原因。我的错,我忘记写了。
    • @NicolasLaurent,是的,您应该包括它们。实际上,在提出问题时,您还应该包括一些示例数据和预期输出。无论如何,我会考虑到这一点进行编辑。
    • 没错,但我认为您的答案有一个想法。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2021-09-12
    • 2022-01-15
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多