如何在SQL Server中对同义汽车品牌进行分组统计?
解决SQL Server中汽车品牌别名合并统计的问题
这里有几种可行的解决方案,帮你把同一品牌的不同别名合并统计:
方案1:将CASE表达式同时用于SELECT和GROUP BY
直接在GROUP BY中复用SELECT里的CASE逻辑,这样就能基于统一后的品牌名称分组:
SELECT CASE WHEN make IN ('VW', 'Volkswagen') THEN 'Volkswagen Group' WHEN make IN ('Mercedes', 'Mercedes-Benz') THEN 'Mercedes-Benz' ELSE make END AS brand, COUNT(*) AS count FROM CarList GROUP BY CASE WHEN make IN ('VW', 'Volkswagen') THEN 'Volkswagen Group' WHEN make IN ('Mercedes', 'Mercedes-Benz') THEN 'Mercedes-Benz' ELSE make END ORDER BY brand
方案2:用CTE/子查询先统一品牌名称,再分组
通过公共表表达式(CTE)先把所有品牌名称标准化,再对标准化后的结果分组,逻辑更清晰:
WITH NormalizedCars AS ( SELECT CASE WHEN make IN ('VW', 'Volkswagen') THEN 'Volkswagen Group' WHEN make IN ('Mercedes', 'Mercedes-Benz') THEN 'Mercedes-Benz' ELSE make END AS normalized_brand FROM CarList ) SELECT normalized_brand AS brand, COUNT(*) AS count FROM NormalizedCars GROUP BY normalized_brand ORDER BY brand
方案3:创建品牌映射表(长期维护首选)
如果后续会有更多品牌别名需要处理,建议创建一个映射表来管理原始品牌和标准品牌的对应关系,这样不用频繁修改统计语句:
首先创建映射表并插入数据:
CREATE TABLE BrandMapping ( OriginalBrand VARCHAR(50) PRIMARY KEY, StandardBrand VARCHAR(50) NOT NULL ) INSERT INTO BrandMapping (OriginalBrand, StandardBrand) VALUES ('VW', 'Volkswagen Group'), ('Volkswagen', 'Volkswagen Group'), ('Mercedes', 'Mercedes-Benz'), ('Mercedes-Benz', 'Mercedes-Benz')
然后关联映射表进行统计:
SELECT COALESCE(bm.StandardBrand, cl.make) AS brand, COUNT(*) AS count FROM CarList cl LEFT JOIN BrandMapping bm ON cl.make = bm.OriginalBrand GROUP BY COALESCE(bm.StandardBrand, cl.make) ORDER BY brand
为什么你之前的方法无效?
- 第一次用CASE时GROUP BY的是原始
make字段,所以VW和Volkswagen还是会被分成两组,只是显示的别名相同 - 直接
GROUP BY type报错是因为SQL Server在处理GROUP BY阶段时,还未解析SELECT子句中定义的别名,无法识别type字段
内容的提问来源于stack exchange,提问作者user3211098
相关产品推荐
相关产品推荐

