按月从两个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。如果你不知道如何做这些事情,你可以问。