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你绝对正确。看看我编辑的帖子。我相信第二个问题现在是正确的。