2011-11-07 107 views
1

我有兩個具有類似佈局的表,涉及INCOME和EXPENSES。 id列是客戶ID。涉及JOINS的SQL問題

我需要客戶總金額的結果,總結收入和費用。

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

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

我的問題是,有些客戶只需要費用和其他人只是收入......所以提前ID不能知道我需要做LEFT or RIGHT JOIN.

在這個例子中的正上方JOIN可以做的伎倆,但如果情況反轉(費用表上的更多客戶),則不起作用。

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

任何幫助?

+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 
2

我相信完全加入將解決您的問題。

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 

會越來越複雜,我敢肯定它會來得心應手另一次:)

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