首页 > 解决方案 > SQL 中多级关系文件的返回计数

问题描述

有 3 个表,业务可以有很多客户,客户可以有很多站点。

我需要一份报告,列出每个企业的客户和网站总数。

    SELECT bus.BusinessID, 
       cb.CustomerBusinessID,
       s.SiteID FROM [dbo].[Business] bus
  left outer join CustomerBusiness cb on cb.BusinessID = bus.BusinessID
  left outer join Site s on cb.CustomerID = s.CustomerID
  Where bus.RecordStatus = 'A'
  and cb.RecordStatus = 'A'
  and s.Sitestatus= 'A'
  Order by Name

我已经加入了文件(见上文),我得到了很多行,但我现在不明白如何获得企业的列表及其总数。

请参阅下面的一些数据。

所以对于企业 ID 33(我还没有包括名称,应该有 3 个客户和 10 个站点)。

任何帮助将不胜感激。

在此处输入图像描述

这是我在对 Kate 提供的代码稍作更改后开始使用的代码。

SELECT bus.Name as Business_Name,
       count(distinct tb.TruckerID) AS num_Truckers,  
       count(distinct cb.CustomerBusinessID) AS num_Customers,
       count(distinct s.SiteID) AS num_Sites  -- distinct probably unnecessary
FROM [dbo].[Business] bus
LEFT JOIN  TruckerBusiness tb
     ON tb.BusinessID = bus.BusinessID AND tb.RecordStatus = 'A'
LEFT JOIN  CustomerBusiness cb
     ON cb.BusinessID = bus.BusinessID AND cb.RecordStatus = 'A'
LEFT JOIN  Site s
     ON cb.CustomerID = s.CustomerID AND s.Sitestatus= 'A'
WHERE bus.RecordStatus = 'A'
Group BY bus.Name;

标签: sqlpowerbi

解决方案


最简单的方法可能是count(distinct)

SELECT bus.BusinessID, 
       count(distinct cb.CustomerBusinessID) AS num_businesses,
       count(distinct s.SiteID) AS num_sites  -- distinct probably unnecessary
FROM [dbo].[Business] bus LEFT JOIN
     CustomerBusiness cb
     ON cb.BusinessID = bus.BusinessID AND
        cb.RecordStatus = 'A' LEFT JOIN
     Site s
     ON cb.CustomerID = s.CustomerID AND
        s.Sitestatus = 'A'
WHERE bus.RecordStatus = 'A'
GROUP BY bus.BusinessID, Name
ORDER BY Name;

请注意,我将过滤器cb移至s子句on。否则,LEFT JOINs 将变为INNER JOINs,因此没有客户的企业或没有站点的客户将不会包含在结果中。


推荐阅读