Проблема с SQL с участием JOINS - PullRequest
1 голос
/ 07 ноября 2011

У меня есть 2 таблицы с одинаковым расположением, включая ДОХОДЫ и РАСХОДЫ.Столбец 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.

. В приведенном выше примере ПРАВИЛЬНОЕ СОЕДИНЕНИЕ может помочь, но если ситуация обратная (больше клиентов за счет расходов)таблица) это не работает.

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

Любая помощь?

Ответы [ 4 ]

6 голосов
/ 07 ноября 2011
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 голосов
/ 07 ноября 2011

Я бы подошел к этому как союз. Сделайте это в своем подзапросе, затем суммируйте его.

Например:

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
2 голосов
/ 07 ноября 2011

Полагаю, полное соединение решит вашу проблему.

1 голос
/ 07 ноября 2011

У вас действительно должен быть другой стол, такой как клиент:

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

Будет менее сложно, и я уверен, что это пригодитсяв другой раз :) 1007 *

...