SQL Server中统计关联超100个地址的客户所属公司数量问题
解决拥有关联地址超100的客户所属公司数量统计问题
你的原SQL语句逻辑偏了一步,咱们来拆解下问题:你要的是有至少一个客户地址数超过100的公司的数量,但原语句是按客户ID分组,最后统计每个客户对应的公司ID(每个客户只属于一个公司,所以每个分组的COUNT(DISTINCT c.Id)都是1),最终得到的是符合条件的客户数量,而非公司数量。
修正后的SQL写法(两种可选)
方法1:先筛选出地址数超100的客户,再关联公司统计
这种写法逻辑更清晰,先通过子查询找出所有满足地址数>100的客户,再关联到对应的公司,最后去重统计公司数量:
SELECT COUNT(DISTINCT c.Id) AS qualifying_company_count FROM Companies c INNER JOIN Customers cu ON cu.company = c.Id INNER JOIN ( -- 先找出地址数超过100的客户ID SELECT Customer FROM Addresses GROUP BY Customer HAVING COUNT(ID) > 100 ) high_address_customers ON high_address_customers.Customer = cu.Id
方法2:先按客户分组筛选,再聚合统计公司
也可以先关联三张表,按客户分组筛选出地址数超100的记录,再对这些记录中的公司ID去重计数:
SELECT COUNT(DISTINCT c.Id) AS qualifying_company_count FROM ( SELECT cu.company FROM Customers cu INNER JOIN Addresses ad ON ad.Customer = cu.Id GROUP BY cu.Id, cu.company HAVING COUNT(ad.ID) > 100 ) customer_company INNER JOIN Companies c ON c.Id = customer_company.company
为什么原SQL不生效?
原语句GROUP BY cu.ID会把结果按客户拆分,每个客户对应一行,每行的COUNT(DISTINCT c.Id)结果都是1(因为一个客户只属于一个公司)。如果你执行原语句,得到的会是N行1(N是符合条件的客户数),而不是你需要的公司总数。
内容的提问来源于stack exchange,提问作者Siavosh Tehrani
相关产品推荐
相关产品推荐

