2014-11-16 3 views
0

Я хочу получить ежемесячные промежуточные итоги для клиентских учетных записей, и если у клиента нет активности за месяц, он вернет 0. В таблице, содержащей каждый месяц, есть поле billing_month; даже если у клиента нет активности, другой клиент. Я хотел сделать левое соединение на столе, чтобы каждый billing_month появлялся, но это не работает. Что я здесь делаю неправильно?LEFT JOIN в ту же таблицу

SELECT COALESCE (SUM(b.Adjusted_Price), 0) AS Amount, a.Billing_Month,  
dbo.tblSubaccounts.Master_Account_Name 
FROM dbo.tblBilling_Detail AS a 
LEFT OUTER JOIN dbo.tblBilling_Detail AS b ON a.ID = b.ID 
INNER JOIN dbo.tblSubaccounts ON 
dbo.tblSubaccounts.ID = b.Linked_Account 
GROUP BY a.Billing_Month, dbo.tblSubaccounts.Master_Account_Name 

Sample Data - Обратите внимание, что клиент 2 (идентификатор клиента) не имеет никаких данных за май, поэтому я хотел бы мая вернуть 0.

ID Billing_Month Adjusted_Price Linked_Account 
1  3/1/14  100   2 
2  4/1/14  200   2 
3  5/1/14  300   3 
+0

Вы можете вставить некоторые данные образца? –

+0

Я разместил некоторые данные образца. – JonnyBravoJr

ответ

2

Попробуйте это:

select coalesce(sum(detail.Adjusted_Price),0) Amount 
, months.Billing_Month 
, accounts.Master_AccountName 
from (
    select distinct Billing_Month 
    from dbo.tblBilling_Detail 
) months 
cross join dbo.tblSubaccounts accounts --cross join so we have a combination of all months & accounts 
left outer join dbo.tblBilling_Detail detail 
    on detail.Linked_Account = accounts.id 
    and detail.Billing_Month = months.Billing_Month 
group by months.Billing_Month 
, accounts.Master_AccountName 

Проблема с тобой заключалась в том, что вы присоединились к таблице подробных фактур на своем идентификаторе; что означает, что вы дважды отодвинули одну и ту же запись (т. е. одну запись из A и одну и ту же запись из B). Это означало, что если у вас не было записи для данного месяца/учетной записи, вы не получили бы этого от этого подхода.

Выше я взял отчетный список месяцев и крест, соединенный с учетными записями, чтобы убедиться, что у нас есть одна запись для каждой комбинированной учетной записи/месяца. Затем я ушел вместе с таблицей подробностей, чтобы мы могли отбросить учетную информацию там, где она существует; группа & сумма соответствует оригиналу; т. е. обеспечить суммирование данных в одну строку для каждого комбинированного счета/месяца.

+0

Спасибо! Это сделал трюк! Замечание: я добавил «ОТ» в ваше решение, если вы хотите его отредактировать. – JonnyBravoJr

+0

Упс - извините, не запустил его, чтобы проверить на наличие опечаток; Благодарю. – JohnLBevan