2016-01-18 3 views
0

Я хочу рассчитать «баланс» для клиента в моем db.MS SQL: Расчет таблицы для каждого результата

Customer Table 
----------------- 
1 - Frank 
2 - Bob 

Invoice Table 
--------------------------------------------------- 
id | customer_id | amount_due | credit_due 
--------------------------------------------------- 
1 | 1   | $10  | 
--------------------------------------------------- 
2 | 1   |   | $6 
--------------------------------------------------- 

Вот типичный оператор sql для поиска информации о клиентах.

SELECT id, name FROM CUSTOMER WHERE id = ? 

Если я хочу, чтобы также получить баланс, я делаю это:

SELECT a.*, b.* FROM 
(SELECT id, name FROM CUSTOMER WHERE id = ?) AS a, 
(SELECT SUM(amount_due - credit_due) AS balance FROM INVOICE WHERE cus_id = ?) AS b 

Запуск этого результата:

-------------------- 
id | name | balance 
--------------------- 
1 | Frank | $4 

Это прекрасно работает при получении только одного клиента, но что, если я хочу сделать более общий поиск? Как и загрузка ВСЕХ клиентов?

Это выход я хотел бы получить

-------------------- 
id | name | balance 
--------------------- 
1 | Frank | $4 
--------------------- 
2 | Bob | $0 

ответ

2

Вы бы просто использовать агрегацию, я думаю:

select c.customer_id, c.name, 
     (coalesce(sum(i.amount_due), 0) - coalesce(sum(i.credit_due), 0)) as balance 
from customer c join 
    invoice i 
    on i.customer_id = c.customer_id 
group by c.customer_id, c.name; 

Я хотел бы отметить, что если поля суммы являются NULL, то выражение sum(amount_due - credit_due) не делает то, что вы ожидаете.

+0

Не должно ли это быть левым объединением? –

+0

В моем «фактическом» коде я использую ISNULL(), чтобы поймать нулевые суммы и просто вернуть $ 0 – Hackmodford

+0

, вы также должны «объединить» 'i.amount_due' .. не сумму' sum' ... 'sum (coalesce (i.amount_due, 0)) 'same with' credit_due' – JamieD77

Смежные вопросы