SQL实现所有组合匹配计数查询(禁用CTE和PIVOT)
问题描述
现有Persons表如下:
| Id | FName | Gender | StatusValue |
|---|---|---|---|
| 1 | Sam | Male | SV001 |
| 2 | Emma | Female | SV002 |
| 3 | Ava | Unknown | |
| 4 | John | Male | |
| 5 | Olivia | Female | |
| 6 | Joe | Male | |
| 7 | Mia | Female |
需要输出如下结果,展示Gender与StatusValue的所有可能组合及对应匹配计数,且不能使用CTE和PIVOT:
| Id | Gender | StatusValue | Count |
|---|---|---|---|
| 1 | Female | SV001 | 0 |
| 2 | Female | SV002 | 1 |
| 3 | Female | Empty | 2 |
| 4 | Male | SV001 | 1 |
| 5 | Male | SV002 | 0 |
| 6 | Male | Empty | 2 |
| 7 | Unknown | SV001 | 0 |
| 8 | Unknown | SV002 | 0 |
| 9 | Unknown | Empty | 1 |
尝试的SQL语句计数结果错误:
SELECT Gender,StatusValue,Count(*) as Count FROM Persons WHERE Gender <> '' AND StatusValue <> '' GROUP BY Gender,StatusValue UNION SELECT CASE WHEN G.Gender <> '' THEN G.Gender ELSE 'Empty' END, CASE WHEN T.StatusValue <> '' THEN T.StatusValue ELSE 'Empty' END, 0 as COUNT from (SELECT DISTINCT Gender FROM Persons) as G, (SELECT DISTINCT StatusValue FROM Persons) as T
正确SQL实现方案
SELECT ROW_NUMBER() OVER (ORDER BY Gender, StatusValue) AS Id, G.Gender, S.StatusValue, COALESCE(P.Count, 0) AS Count FROM (SELECT DISTINCT Gender FROM Persons) G CROSS JOIN (SELECT 'SV001' AS StatusValue UNION SELECT 'SV002' UNION SELECT 'Empty') S LEFT JOIN (SELECT Gender, CASE WHEN StatusValue = '' THEN 'Empty' ELSE StatusValue END AS StatusValue, COUNT(*) AS Count FROM Persons GROUP BY Gender, CASE WHEN StatusValue = '' THEN 'Empty' ELSE StatusValue END) P ON G.Gender = P.Gender AND S.StatusValue = P.StatusValue ORDER BY Id;
方案说明
- 生成全量组合:通过
CROSS JOIN将所有不同的Gender与预设的StatusValue选项(SV001、SV002、Empty)做笛卡尔积,确保覆盖所有可能的配对。 - 统计原表数据:子查询P先将原表中空的StatusValue转换为'Empty',再按Gender和处理后的StatusValue分组统计实际匹配数量。
- 补全空计数:使用
LEFT JOIN关联全量组合与统计结果,通过COALESCE将未匹配到的统计值(null)转换为0。 - 生成自增ID:利用
ROW_NUMBER()函数生成结果中的自增Id,按Gender和StatusValue排序保证顺序一致。
原SQL错误原因
- UNION操作会导致重复组合(原表已存在的组合会被统计两次:一次来自GROUP BY,一次来自笛卡尔积的0计数)。
- WHERE条件过滤掉了空StatusValue的行,导致统计不全。
- 未统一将空StatusValue转换为'Empty',无法与目标结果的分类对齐。
内容的提问来源于stack exchange,提问作者Viena Vinod
相关产品推荐
相关产品推荐

