涉及JOINS的SQL问题

时间:2011-11-07 03:19:33

标签: sql sql-server sql-server-2008 tsql aggregate-functions

我有两个布局相似的表,包括INCOME和EXPENSES。 id列是客户ID。

我需要一个客户总计金额的结果,总结收入和支出。

Table: Income
| id | amountIN|
+--------------+
| 1  |  a      |  
| 2  |  b      |  
| 3  |  c      |  
| 4  |  d      |  

Table: Expenses
| id | amountOUT|
+---------------+
| 1  |  -x      |   
| 4  |  -z      | 

我的问题是,有些客户只有开支而有些只是收入...所以无法提前知道我需要做LEFT or RIGHT JOIN.

在上面的示例中,RIGHT JOIN可以解决问题,但如果情况被颠倒(费用表上的客户越多),它就无法工作。

Expected Result
    | id | TotalAmount|
    +--------------+
    | 1  |  a - x  |  
    | 2  |  b      |  
    | 3  |  c      |  
    | 4  |  d - z  |

任何帮助?

4 个答案:

答案 0 :(得分:6)

select id, SUM(Amount)
from
(
    select id, amountin as Amount
    from Income
    union all
    select id, amountout as Amount
    from Expense
) a
group by id

答案 1 :(得分:2)

我相信完整的加入会解决您的问题。

答案 2 :(得分:2)

我会把它当成一个联盟。在子查询中执行此操作然后对其进行总结。

例如:

select id, sum(amt) from
(
  select i.id, i.amountIN as amt from Income i
  union all
  select e.id, e.amountOUT as amt from Expenses e
)
group by id

答案 3 :(得分:1)

你应该有另一个像客户端的表:

Table: Client
| id | 
+----+
| 1  |  
| 2  |   
| 3  |  
| 4  |  

所以你可以做那样的事情

SELECT Client.ID,  COALESCE(Income.AmountIN, 0) - COALESCE(Expenses.AmountOUT, 0)
FROM Client c
LEFT JOIN Income i ON i.ID = c.ID
LEFT JOIN Expense e ON e.ID = c.ID

会不那么复杂,我相信它会再次派上用场了:)