按月从两个mysql表执行计算

按月从两个mysql表执行计算,mysql,constraints,Mysql,Constraints,我有两张桌子,一张是收入表,一张是支出表 收入 id date amount person_id 1 2015-08-03 00:00:00 100 1 2 2015-09-03 13:32:10 200 2 费用 id date amount person_id 1 2015-09-03 13:32:43 12 1 2 2015-08-03 13:32:56 20 2 3

我有两张桌子,一张是收入表,一张是支出表

收入

id date                  amount person_id
1  2015-08-03 00:00:00   100    1
2  2015-09-03 13:32:10   200    2
费用

id date                  amount person_id
1  2015-09-03 13:32:43   12     1
2  2015-08-03 13:32:56   20     2
3  2015-08-03 13:35:55   17     2
4  2015-09-03 13:36:20   12     2
我想在mysql中做的是按月计算每个人的收入减去支出后的余额

我的SQL语句

SELECT
e.person_id,
Concat(MonthName(e.date), " ", Year(e.date)) AS Month,
SUM(e.amount) AS "Total Expenses",
SUM(i.amount) AS "Total Income",
SUM(i.amount)- SUM(e.amount) AS "Balance"
FROM
a_expenses e
LEFT OUTER JOIN 
a_income i ON e.person_id=i.person_id
 GROUP BY e.amount, e.person_id, Month(e.date)
结果

person_id Month           Total Expenses Total Income Balance
1         September 2015  12             100          88
2         September 2015  12             200          188
2         August 2015     17             200          183
2         August 2015     20             200          180

如何设置约束条件,即收入是根据每个人当月的总和计算的,并且结果仅显示每个人每月一次。

假设费用表中每个月都有值,或者收入表中没有月,费用表中也没有月。你不能保证这些条件会一直存在

为了避免这种情况,您需要包含一个列出人员的表,如下所示:

SELECT
      p.id
    , p.name
    , Concat(MonthName(COALESCE(e.mnth, i.mnth)), " ", YEAR(COALESCE(e.yr, i.yr))) AS Month
    , SUM(COALESCE(e.expense_amount,0)) AS "Total Expenses"
    , SUM(COALESCE(i.income_amount,0)) AS "Total Income"
    , SUM(COALESCE(i.income_amount,0) - COALESCE(e.expense_amount,0)) AS "Balance"
FROM persons p
      LEFT OUTER JOIN (
            SELECT
                  person_id
                , MONTH(date) AS mnth
                , YEAR(date) AS yr
                , SUM(amount) AS expense_amount
            FROM expenses
            GROUP BY person_id
                   , MONTH(date)
                   , YEAR(date)
      ) e ON p.id = e.person_id
      LEFT OUTER JOIN (
            SELECT
                  person_id
                , MONTH(date) AS mnth
                , YEAR(date) AS yr
                , SUM(amount) AS income_amount
            FROM income 
            GROUP BY person_id
                   , MONTH(date)
                   , YEAR(date)
      ) i ON p.id = i.person_id and e.mnth = i.mnth and e.yr = i.yr
像这样试试

SELECT
e.person_id,
e.Month,
SUM(e.amount) AS "Total Expenses",
SUM(i.amount) AS "Total Income",
SUM(i.amount)- SUM(e.amount) AS "Balance"
FROM
a_income i
LEFT OUTER JOIN 
(select sum(amount) as amount,person_id,Concat(MonthName(date), " ",
Year(i.date)) as Month from a_expenses group by person_id, Month(date)) 
 as  e ON e.person_id=i.person_id
 GROUP BY e.person_id, e.Month

请使用示例SqlFiddle进行检查。从group by子句中删除e.amount。删除e.amount将使8月份的总收入翻倍个人id、月份、总费用、总收入、余额1、2015年9月、12100、88 2、2015年8月、37400363 2、2015年9月、12200188那么您的预期输出是什么?谢谢。我得到了必须构建的SQL查询的要点。谢谢!这正是我想要的,完全不知道。没问题。如果此答案是您的解决方案,请单击复选标记以指示已选择答案。对帮助您达成解决方案的任何其他答案使用UPVOUTS。如果你不知道如何做这些事情,你可以问。