从两个不同的表返回相同成员的SUM值

时间:2017-09-24 12:11:07

标签: mysql sql

我有三张桌子;一个存储用户,一个存储每个用户的费用,第三个表返回每个用户。每个都由用户连接。但是有很多用户不使用该服务,因此我希望避免使用无法扫描整个用户表的解决方案。

我正在使用MySQL btw。

users: id, name
expenses: id,userid,amount,date
returns:id,userid,amount

示例数据将是:

users:
 1             Sosuna
 2             Mike

expenses:

 1 1  100 2017-01-01
 2 1   20 2017-01-13
 3 2   50 2017-02-13

returns:

 1  1  20
 2  1  10
 3  1  30
 4  1  10

现在预期的输出只是它们的组合。用户无法在退货中存在,而且不存在费用,等等。

 user_id       name      total_expenses        total_returns
   1          Sosuna       120                    70
   2           Mike         50                     0

我尝试了几个查询,但都没有。此UNION ALL查询有效,但输出不是所需的。我希望在不使用任何前端内容的情况下获得输出:

    SELECT SUM(amount) as total_given,userid,'expense' as source FROM `expenses` GROUP BY userid,source
  UNION ALL
  SELECT SUM(amount) as total_returned,userid,'returnedback' as source FROM returns GROUP BY userid,source ORDER BY userid,source

1 个答案:

答案 0 :(得分:2)

这个怎么样:

select id, max(name) as name, sum(expenses) as expenses, sum(returns) as returns
from ((select id, name, 0 as expenses, 0 as returns
       from users
      ) union all
      (select userid, null, amount, 0
       from expenses
      ) union all
      (select userid, null, 0, amount
       from returns
      )
     ) uer
 group by id;

编辑:

另一种方法是:

select u.*,
       (select sum(e.amount) from expenses e where e.userid = u.id
       ) as expenses,
       (select sum(r.amount) from returns r where r.userid = u.id
       ) as returns
from users;

如果您在expenses(userid, amount)returns(userid, amount)上有索引,这会更快。

相关问题