【问题标题】:Difference of sums from two different tables with grouping statement in MySql [duplicate]MySql中带有分组语句的两个不同表的总和差异[重复]
【发布时间】:2019-01-29 05:26:56
【问题描述】:

我正在创建一个带有销售/付款选项的客户门户,其中所有销售都在一个表中,所有付款都在另一个表中。对于客户状态表,我需要得到每个客户的所有付款和每个客户的所有销售加上它们之间的差额的总和。

示例表:

clients

====================================
id  client_name
====================================
1   School "Mike Jordan"
2   Car wash "Blah blah"

purchasing

===================================
id  client_id  amount
===================================
1   1          1000
2   1          500
3   2          800
4   2          800

payments

===================================
id  client_id  amount
1   1          300
2   2          200
3   2          200

我尝试过内部连接和分组,但这并没有正确地得到总和,总是更大的,就像它在计算我不想要的东西(没有总数,只是试图得到总和:

select clients.`client_name `,
sum(purchasing.amount) as SOLD,
sum(payments.amount) as PAID 
from clients
inner join payments on payments.client_id=clients.id
inner join purchasing on purchasing.client_id=clients.id
group by clients.id

我得到不同结果的地方(都更大)。

client_name           SOLD  PAID
================================
School "Mike Jordan"  1500  600
Car wash "Blah blah"  3200  800

如果我尝试按 payment.id 和/或 purchase.id 添加分组,则得到两个以上的结果...我知道存在分组问题,但我真的不知道它在哪里。

我想添加新列,这只是 SOLD 和 PAID 之间的区别,但是服务器生成错误消息,表明 SOLD 和 PAID 不在字段列表中。

知道如何通过单个查询来完成此任务吗?

【问题讨论】:

    标签: mysql group-by


    【解决方案1】:

    你可以试试这个。使用UNION ALL 组合purchasingpayments 表然后joinclients

    下一步做SUMgroup by

    create table clients(
       id int,
       client_name varchar(50)
    );
    
    insert into clients values (1,'School "Mike Jordan"');
    insert into clients values (2,'Car wash "Blah blah"');
    
    
    create table purchasing(
      id int,
       client_id int,
       amount int
    );
    
    
    insert into purchasing values (1,1,1000);
    insert into purchasing values (2,1,500);
    insert into purchasing values (3,2,800);
    insert into purchasing values (4,2,800);
    
    create table payments(
      id int,
       client_id int,
       amount int
    );
    insert into payments values (1,1,300);
    insert into payments values (2,2,200);
    insert into payments values (3,2,200);
    

    查询 1

    select c.client_name,
           sum(SOLD) as SOLD,
            sum(PAID) as PAID
    from (
        SELECT client_id,amount as SOLD,0 as PAID  
        FROM purchasing
        UNION ALL 
        SELECT client_id,0,amount   
        FROM payments
    )t1 INNER JOIN clients c on t1.client_id = c.id
    group by c.client_name
    

    Results

    |          client_name | SOLD | PAID |
    |----------------------|------|------|
    | Car wash "Blah blah" | 1600 |  400 |
    | School "Mike Jordan" | 1500 |  300 |
    

    【讨论】:

    • 是的..这个也可以...谢谢
    • 只是找出这个更好的解决方案 :) 如果没有任何付款,只是出售,它根本不会显示在该客户的列表中,只有当有已售和已付款的项目时。在此解决方案中,无论每个客户是刚刚售出商品还是已付款商品,它都会显示
    【解决方案2】:

    在进行联接之前,您需要汇总表。

    SELECT clients.`client_name`
        ,purchasing_sum.SOLD
        ,payments_sum.PAID
    FROM clients
    INNER JOIN (
        SELECT client_id
            ,sum(amount) as PAID
        FROM payments
        GROUP BY client_id
        ) payments_sum ON payments_sum.client_id = clients.id
    INNER JOIN (
        SELECT client_id
            ,sum(amount) as SOLD
        FROM purchasing
        GROUP BY client_id
        ) purchasing_sum ON purchasing_sum.client_id = clients.id
    GROUP BY clients.id
    

    【讨论】:

    • purchasing_sum.SOLD 不在字段列表中...
    • 已修复 - 我很着急,搞砸了子查询。
    • SELECT clients.client_name , payment_sum.PAID , purchase_sum.SOLD FROM clients INNER JOIN ( SELECT client_id, sum(amount) PAID from payment GROUP BY client_id ) payment_sum ON payment_sum.client_id = clients.id INNER JOIN ( SELECT client_id, sum(amount) SOLD from purchase GROUP BY client_id ) purchase_sum ON purchase_sum.client_id = clients.id GROUP BY clients.id 这个作品
    • total 工作正常,只是将 (payments_sum.PAID-purchasing_sum.SOLD) 添加为 TOTAL ...并且它工作正常!谢谢伙计,你救了我的命!
    • 没问题 - 关键是了解原因。原始联接包含同一 ID 的多次付款和多次销售。因此,在一种情况下,您有 2 次销售 X 2 次购买,即 4 行 - 总结起来,您对这两个字段的期望值实际上是双倍的。需要将 2 个表减少到每个 ID 1 行,然后您可以安全地加入它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多