SQL实现:统计企业的唯一与共享供应商数量并拆分列
解决方案:统计各企业的唯一与共享供应商数量
需求分析
我们需要基于供应商-企业关联表,统计每个企业的两类供应商数量:
- 唯一供应商:仅与当前企业关联,未出现在其他企业的供应商
- 共享供应商:与至少两个企业关联的供应商
实现步骤
- 先计算每个供应商全局关联的企业总数(判断该供应商是唯一还是共享)
- 将该统计结果与原表关联,按企业分组后分别统计两类供应商的数量
完整SQL代码
WITH VendorCompanyCount AS ( -- 计算每个供应商关联的企业总数 SELECT Vendor, Company, COUNT(*) OVER (PARTITION BY Vendor) AS TotalCompanies FROM your_table_name -- 替换为你的实际表名 ) SELECT Company AS 企业(Company), -- 统计唯一供应商数量:TotalCompanies=1的供应商 SUM(CASE WHEN TotalCompanies = 1 THEN 1 ELSE 0 END) AS 唯一供应商(UniqueVendors), -- 统计共享供应商数量:TotalCompanies>1的供应商 SUM(CASE WHEN TotalCompanies > 1 THEN 1 ELSE 0 END) AS 共享供应商(SharedVendors) FROM VendorCompanyCount GROUP BY Company ORDER BY Company;
代码解释
- CTE部分:使用窗口函数
COUNT(*) OVER (PARTITION BY Vendor),为每条记录标记其所属供应商关联的企业总数,无需提前分组,保留每条供应商-企业的关联关系。 - 主查询部分:按企业分组,通过
CASE语句分别筛选出唯一/共享供应商,用SUM统计数量,最终得到每个企业的两类供应商数。
验证结果
执行上述代码后,输出结果将与你期望的格式完全一致:
| 企业(Company) | 唯一供应商(UniqueVendors) | 共享供应商(SharedVendors) |
|---|---|---|
| C1 | 1 | 3 |
| C2 | 1 | 2 |
| C3 | 2 | 2 |
兼容旧版SQL的替代方案
如果使用的是不支持窗口函数的旧版SQL(如MySQL 5.x),可以用子查询实现:
SELECT t.Company AS 企业(Company), SUM(CASE WHEN vc.TotalCompanies = 1 THEN 1 ELSE 0 END) AS 唯一供应商(UniqueVendors), SUM(CASE WHEN vc.TotalCompanies > 1 THEN 1 ELSE 0 END) AS 共享供应商(SharedVendors) FROM your_table_name t JOIN ( SELECT Vendor, COUNT(DISTINCT Company) AS TotalCompanies FROM your_table_name GROUP BY Vendor ) vc ON t.Vendor = vc.Vendor GROUP BY t.Company ORDER BY t.Company;
内容的提问来源于stack exchange,提问作者Neffets
相关产品推荐
相关产品推荐

