You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL实现:统计企业的唯一与共享供应商数量并拆分列

解决方案:统计各企业的唯一与共享供应商数量

需求分析

我们需要基于供应商-企业关联表,统计每个企业的两类供应商数量:

  • 唯一供应商:仅与当前企业关联,未出现在其他企业的供应商
  • 共享供应商:与至少两个企业关联的供应商

实现步骤

  1. 先计算每个供应商全局关联的企业总数(判断该供应商是唯一还是共享)
  2. 将该统计结果与原表关联,按企业分组后分别统计两类供应商的数量

完整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)
C113
C212
C322

兼容旧版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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 19:15:56