Mysql 来自两个单独表的SQL结果(差异)
我有两张桌子- 收入Mysql 来自两个单独表的SQL结果(差异),mysql,sql,subquery,sum,Mysql,Sql,Subquery,Sum,我有两张桌子- 收入 Id - ProjectId - inAmount 1 - 2 200 2 - 2 100 3 - 1 100 4 - 2 100 5 - 1 200 in_id - in_source - in_amount 1 - 2 200 2 - 2
Id - ProjectId - inAmount
1 - 2 200
2 - 2 100
3 - 1 100
4 - 2 100
5 - 1 200
in_id - in_source - in_amount
1 - 2 200
2 - 2 100
3 - 1 100
4 - 2 100
5 - 1 200
费用
Id - ProjectId - exAmount
1 - 2 50
2 - 1 100
3 - 2 120
4 - 1 70
ex_id - mh_id - ex_amount
1 - 2 50
2 - 1 100
3 - 2 120
4 - 1 70
现在我想要这些结果
结果
ProjectId - Total Income - Total Expense - Difference
1 result result result
2 result result result
记住:所有这些我必须在SQL中完成的工作
我已经做了总收入,总费用,但什么是更好的方式来差异
-----编辑
我已经试过了
SELECT sum(ex_amount) as expense,
sum(in_amount) as income,
sum(in_amount) - sum(ex_amount) as Difference,
project_name
FROM expense,
project,
income
WHERE expense.projectId = Project.id
AND income.ProejctId = Project.id
group by mh_name";
第二次编辑
Id - ProjectId - exAmount
1 - 2 50
2 - 1 100
3 - 2 120
4 - 1 70
ex_id - mh_id - ex_amount
1 - 2 50
2 - 1 100
3 - 2 120
4 - 1 70
好的,请理解最初的逻辑。表中的费用有很多与项目相关的记录,表中的收入现在也有相同的记录。我想要每个项目的总收入、每个项目的总费用和每个项目的差异的结果
用这些字段写下你的答案
收入
Id - ProjectId - inAmount
1 - 2 200
2 - 2 100
3 - 1 100
4 - 2 100
5 - 1 200
in_id - in_source - in_amount
1 - 2 200
2 - 2 100
3 - 1 100
4 - 2 100
5 - 1 200
费用
Id - ProjectId - exAmount
1 - 2 50
2 - 1 100
3 - 2 120
4 - 1 70
ex_id - mh_id - ex_amount
1 - 2 50
2 - 1 100
3 - 2 120
4 - 1 70
主_头或项目
mh_id - mh_name
1 - abc
2 - ase
3 - czz
4 - xys
_source=mh_id中的注释
此时,我正在使用以下查询
每个项目的总收入
SELECT sum(in_amount) as amount, mh_name FROM income, main_head WHERE income.in_source = main_head.mh_id group by mh_name Order By amount desc
SELECT sum(ex_amount) as amount, mh_name FROM expense, main_head WHERE expense.mh_id = main_head.mh_id group by mh_name Order By amount desc
每个项目的总费用
SELECT sum(in_amount) as amount, mh_name FROM income, main_head WHERE income.in_source = main_head.mh_id group by mh_name Order By amount desc
SELECT sum(ex_amount) as amount, mh_name FROM expense, main_head WHERE expense.mh_id = main_head.mh_id group by mh_name Order By amount desc
由我解决……
编辑:我们都错了。因为没有子查询的连接将连接所有匹配项,所以它会给我们重复的结果。这是正确的答案和正确的结果,否则您将得到双值:
select
i.projectid,
i.inamount as Income,
e.examount as Expense,
i.inamount - e.examount as [Difference]
from
(
select projectid, SUM(inamount) as inamount
from income
group by projectid
) as i
full outer join
(
select projectid, SUM(examount) as examount
from expense
group by projectid
) as e
on i.projectid = e.projectid
我保留了我原来的答案,以便比较。第二个查询是正确的
编辑:我们都错了。因为没有子查询的连接将连接所有匹配项,所以它会给我们重复的结果。这是正确的答案和正确的结果,否则您将得到双值:
select
i.projectid,
i.inamount as Income,
e.examount as Expense,
i.inamount - e.examount as [Difference]
from
(
select projectid, SUM(inamount) as inamount
from income
group by projectid
) as i
full outer join
(
select projectid, SUM(examount) as examount
from expense
group by projectid
) as e
on i.projectid = e.projectid
我保留了我原来的答案,以便比较。第二个查询是正确的。此SQL应该适用于您: 我假设收入和支出表之间存在1:1的关系。否则,您可能需要使用一些左连接
SELECT i.ProjectId,
sum(inAmount) AS "Total Income",
sum(exAmount) AS "Total Expense",
(sum(inAmount) - sum(exAmount)) AS "Difference"
FROM Income i
JOIN Expense e
ON i.project_id = e.project_id
GROUP BY i.ProjectId
更新的答案反映了0-多收入和0-多支出的可能性:
SELECT i.ProjectId,
i.income AS "Total Income",
e.expense AS "Total Expense",
(i.income - e.expense) AS "Difference"
FROM (SELECT ProjectId, sum(inAmount) AS income FROM Income GROUP BY ProjectId) i
FULL OUTER JOIN (SELECT ProjectId, sum(exAmount) AS expense FROM Income GROUP BY ProjectId) e
ON i.project_id = e.project_id
此SQL应该适用于您: 我假设收入和支出表之间存在1:1的关系。否则,您可能需要使用一些左连接
SELECT i.ProjectId,
sum(inAmount) AS "Total Income",
sum(exAmount) AS "Total Expense",
(sum(inAmount) - sum(exAmount)) AS "Difference"
FROM Income i
JOIN Expense e
ON i.project_id = e.project_id
GROUP BY i.ProjectId
更新的答案反映了0-多收入和0-多支出的可能性:
SELECT i.ProjectId,
i.income AS "Total Income",
e.expense AS "Total Expense",
(i.income - e.expense) AS "Difference"
FROM (SELECT ProjectId, sum(inAmount) AS income FROM Income GROUP BY ProjectId) i
FULL OUTER JOIN (SELECT ProjectId, sum(exAmount) AS expense FROM Income GROUP BY ProjectId) e
ON i.project_id = e.project_id
您的尝试和几个答案所面临的问题是,您正在将数据集连接在一起 例如,项目2有3个收入记录和2个费用记录。你实际上不想把这些连接在一起,结果会得到6条记录
Id - ProjectId - inAmount Id - ProjectId - exAmount
1 - 2 200 1 2 50
2 - 2 100 1 2 50
4 - 2 100 1 2 50
1 - 2 200 3 2 120
2 - 2 100 3 2 120
4 - 2 100 3 2 120
如您所见,这将导致严重的重复
有几种标准方法。例如相关子查询或内联视图
相关子查询
SELECT
*,
(SELECT SUM(inAmount) FROM income WHERE projectId = project.Id) AS income,
(SELECT SUM(exAmount) FROM expense WHERE projectId = project.Id) AS expense
FROM
project
内联视图
SELECT
project.Id,
income.inAmount,
expense.exAmount
FROM
project
LEFT JOIN
(SELECT projectID, SUM(inAmount) AS inAmount FROM income GROUP BY projectID) AS income
ON income.projectID = project.ID
LEFT JOIN
(SELECT projectID, SUM(exAmount) AS exAmount FROM expense GROUP BY projectID) AS expense
ON expense.projectID = project.ID
编辑
对哈米丹试图使用联合的修正
SELECT
projectID,
SUM(inAmount),
SUM(exAmount)
FROM
(
SELECT projectID, inAmount, 0 AS exAmount FROM income GROUP BY projectID
UNION ALL
SELECT projectID, 0 as inAmount, exAmount FROM expense GROUP BY projectID
)
AS data
GROUP BY
projectID
您的尝试和几个答案所面临的问题是,您正在将数据集连接在一起 例如,项目2有3个收入记录和2个费用记录。你实际上不想把这些连接在一起,结果会得到6条记录
Id - ProjectId - inAmount Id - ProjectId - exAmount
1 - 2 200 1 2 50
2 - 2 100 1 2 50
4 - 2 100 1 2 50
1 - 2 200 3 2 120
2 - 2 100 3 2 120
4 - 2 100 3 2 120
如您所见,这将导致严重的重复
有几种标准方法。例如相关子查询或内联视图
相关子查询
SELECT
*,
(SELECT SUM(inAmount) FROM income WHERE projectId = project.Id) AS income,
(SELECT SUM(exAmount) FROM expense WHERE projectId = project.Id) AS expense
FROM
project
内联视图
SELECT
project.Id,
income.inAmount,
expense.exAmount
FROM
project
LEFT JOIN
(SELECT projectID, SUM(inAmount) AS inAmount FROM income GROUP BY projectID) AS income
ON income.projectID = project.ID
LEFT JOIN
(SELECT projectID, SUM(exAmount) AS exAmount FROM expense GROUP BY projectID) AS expense
ON expense.projectID = project.ID
编辑
对哈米丹试图使用联合的修正
SELECT
projectID,
SUM(inAmount),
SUM(exAmount)
FROM
(
SELECT projectID, inAmount, 0 AS exAmount FROM income GROUP BY projectID
UNION ALL
SELECT projectID, 0 as inAmount, exAmount FROM expense GROUP BY projectID
)
AS data
GROUP BY
projectID
什么是RDBMS?并非所有的提供者都有这样做的方法。我使用的是Equi连接技术mySQLThis答案是coming income 21102262000 ex 114719157 dif 20987542843什么是项目表,什么是mh_名称?请不要使用隐式连接语法-这很容易忘记连接标准。还有什么RDBMS?并非所有的供应商都有这样做的方法。我使用的是Equi连接技术。这个答案是收入21102262000 ex 114719157 dif 20987542843项目表是什么?mh_名称是什么?请,永远不要使用隐式连接语法-这很容易忘记连接条件。项目2有3个收入记录和2个支出记录。这个连接为项目2生成了6条记录。在意识到表中每个项目有多个收入和多个支出后,我打算更新我的答案,但这完美地抓住了它。看起来不错!项目2有3个收入记录和2个费用记录。这个连接为项目2生成了6条记录。在意识到表中每个项目有多个收入和多个支出后,我打算更新我的答案,但这完美地抓住了它。看起来不错!这将给出错误的结果,它将形成一个迷你笛卡尔积。我同意,这将是好的。因为在看了他最新的问题后,似乎有0对多的收入和0对多的支出。@ypercurse你绝对正确。看看我编辑的帖子。我相信第二个查询现在是正确的。这将给出错误的结果,它将形成一个迷你笛卡尔积。我同意,这将是好的。因为在看了他最新的问题后,似乎有0对多的收入和0对多的支出。@ypercurse你绝对正确。看看我编辑的帖子。我相信第二个问题现在是正确的。