【问题标题】:LEFT JOIN to same table左连接到同一张表
【发布时间】:2023-04-04 08:00:01
【问题描述】:

我想导出客户帐户的每月小计,如果客户当月没有活动,它将返回 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)没有 May 的数据,因此我希望 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

【问题讨论】:

  • 你能粘贴一些示例数据吗??
  • 我发布了一些示例数据。

标签: sql-server tsql


【解决方案1】:

试试这个:

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 的同一记录)。这意味着,如果您没有给定月份/帐户组合的记录,您将无法通过这种方法获得它。

在上面,我采用了不同的月份列表并与帐户交叉连接,以确保每个帐户/月份组合都有一个记录。然后我将其与明细表连接起来,以便我们可以在存在的地方提取会计信息;组和总和根据您的原件;即确保我们将每个帐户/月组合的数据汇总到一行中。

【讨论】:

  • 谢谢!那成功了!旁注:我在您的解决方案中添加了“FROM”,以防您想对其进行编辑。
  • 糟糕——抱歉,没有运行它来检查错别字;谢谢。
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多