如何在单条SQL JOIN查询中实现多维度统计计数?
解决客户-房产-租户-许可证的层级统计问题
嘿,我来帮你搞定这个统计需求!你已经迈出了第一步,现在只需要在现有SQL基础上,正确关联租户和许可证表,同时避免重复计数(这是多层一对多关联统计的关键坑点)。
问题分析
因为每个层级都是一对多关系(客户→多个房产,房产→多个租户,租户→多个许可证),如果直接把所有表join起来,会产生笛卡尔积,导致统计出来的数量远大于实际值——比如一个房产有5个租户,这条房产记录会被重复5次,直接count的话房产数就会被多算。所以必须用COUNT(DISTINCT)来确保每个实体只被统计一次。
最终SQL语句
假设你的租户表是profile_tenant(关联房产的字段是Property_ID),许可证表是profile_permit(关联租户的字段是Tenant_ID),可以用以下SQL实现需求:
SELECT cli.Client_Name AS Client, COUNT(DISTINCT prop.id) AS Properties, COUNT(DISTINCT tnt.id) AS Tenants, COUNT(DISTINCT prmt.id) AS Permits FROM profile_Client cli LEFT JOIN profile_property prop ON cli.id = prop.Client_ID LEFT JOIN profile_tenant tnt ON prop.id = tnt.Property_ID LEFT JOIN profile_permit prmt ON tnt.id = prmt.Tenant_ID GROUP BY cli.Client_Name ORDER BY cli.Client_Name;
语句解释
COUNT(DISTINCT prop.id):统计每个客户的唯一房产数量,避免因为多租户导致的重复计数。COUNT(DISTINCT tnt.id):统计每个客户关联的唯一租户总数,不管租户属于哪个房产。COUNT(DISTINCT prmt.id):统计每个客户关联的唯一许可证总数,不管许可证属于哪个租户/房产。LEFT JOIN:确保即使客户没有房产、租户或许可证,也会被保留在结果中(对应数量为0)。
预期输出
执行后会得到你想要的表格样式:
| Client | Properties | Tenants | Permits |
|---|---|---|---|
| Client 1 | 212 | 4023 | 12203 |
| Client 2 | 162 | 2032 | 7203 |
如果你的表字段名和假设的不一样,只需要调整JOIN条件里的关联字段即可~
内容的提问来源于stack exchange,提问作者user2637120
相关产品推荐
相关产品推荐

