LEFT JOIN到同一个表

时间:2014-11-16 11:34:28

标签: sql-server tsql

我想为客户帐户派生月度小计,如果客户端当月没有活动,则会返回0.表格中有一个billing_month字段,其中包含每个月;即使客户没有活动,另一个客户也会。我想在桌面上进行左连接,这样每个billing_month都会显示但是不起作用。我在这里做错了什么?

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

示例数据 - 请注意,客户2(客户ID)没有5月的数据,所以我希望May返回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

1 个答案:

答案 0 :(得分: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

与您有关的问题是您在其ID上加入了结算明细表;这意味着你两次拉回相同的记录(即A中的一个记录和B中的相同记录)。这意味着如果你没有给定月份/帐户组合的记录,你就不会从这种方法中得到它。

上面我已经采用了不同的月份列表并且与帐户交叉以确保我们每个帐户/月组合都有一条记录。然后,我将其与详细信息表联系起来,以便我们可以将会计信息拉回到存在的位置;小组&总和是按照你原来的;即确保我们将每个帐户/月组合的数据汇总成一行。