SQL分组查询:统计列中所有不同值的数量(含数量为0的情况)
解决方法
要显示计数为0的ID Type,核心是以所有存在的ID Type作为基准数据集,再左关联符合条件的客户数据,具体SQL如下:
-- 先获取所有唯一的ID Type,作为基准 WITH AllIdTypes AS ( SELECT DISTINCT [ID Type] FROM 表2 ) SELECT ait.[ID Type], -- 统计匹配到的活跃A类客户数,无匹配则为0 COUNT(t1.ID) AS [Count of Active Cust Type A] FROM AllIdTypes ait -- 左连接:保留所有ID Type,即使没有对应客户 LEFT JOIN 表2 t2 ON ait.[ID Type] = t2.[ID Type] LEFT JOIN 表1 t1 ON t2.ID = t1.ID AND t1.[Cust Type] = 'A' AND t1.Status = 'Active' GROUP BY ait.[ID Type] ORDER BY ait.[ID Type];
关键逻辑说明
- 基准数据集(AllIdTypes):用
DISTINCT从表2提取所有ID Type,确保哪怕没有对应活跃A类客户的Type(比如Type5)也会被包含进来。 - 左连接顺序:先关联基准表和表2,再左连接筛选后的表1(注意把筛选条件写在
ON里而不是WHERE,否则会把无匹配的行过滤掉)。 - 计数方式:用
COUNT(t1.ID)而不是COUNT(*),因为左连接无匹配时t1.ID为NULL,COUNT会自动忽略NULL值,得到0;如果用COUNT(*)会把左连接生成的空行算成1,结果错误。
如果你的SQL版本不支持CTE(比如旧版MySQL),可以改用子查询:
SELECT ait.[ID Type], COUNT(t1.ID) AS [Count of Active Cust Type A] FROM (SELECT DISTINCT [ID Type] FROM 表2) ait LEFT JOIN 表2 t2 ON ait.[ID Type] = t2.[ID Type] LEFT JOIN 表1 t1 ON t2.ID = t1.ID AND t1.[Cust Type] = 'A' AND t1.Status = 'Active' GROUP BY ait.[ID Type] ORDER BY ait.[ID Type];
内容的提问来源于stack exchange,提问作者excel_noob
相关产品推荐
相关产品推荐

