如何按位置与OS类型分组聚合数据?SQL分组查询优化求助
正确的SQL分组聚合方法实现需求
你的问题出在GROUP BY LEFT(Location, 4)这部分:截取Location前4个字符会把AB02和AB02 - SW归为同一个分组,但你明确需要这两个Location分别处理,所以这个分组逻辑完全不符合需求。
修正思路
要实现按完整的Location值和标准化后的OS进行合并,你需要:
- 保留完整的
Location字段用于分组,不要截取; - 确保GROUP BY子句与SELECT中标准化后的OS逻辑一致(不同SQL方言对别名的支持不同,有的可以直接用别名,有的需要重复CASE表达式)。
修正后的SQL语句
通用版本(适用于所有SQL方言)
SELECT Location, CASE WHEN OS LIKE '%Windows 7%' THEN 'Windows 7' WHEN OS LIKE '%Windows 10%' THEN 'Windows 10' ELSE OS END AS OS, COUNT(OS) AS 'Count' -- 若原表有单独的Count字段需求和,替换为 SUM(Count) FROM ComputerProperties GROUP BY Location, CASE WHEN OS LIKE '%Windows 7%' THEN 'Windows 7' WHEN OS LIKE '%Windows 10%' THEN 'Windows 10' ELSE OS END ORDER BY Location;
简化版本(支持GROUP BY使用SELECT别名的方言,如MySQL、PostgreSQL)
SELECT Location, CASE WHEN OS LIKE '%Windows 7%' THEN 'Windows 7' WHEN OS LIKE '%Windows 10%' THEN 'Windows 10' ELSE OS END AS OS, COUNT(OS) AS 'Count' FROM ComputerProperties GROUP BY Location, OS -- 直接使用SELECT中定义的OS别名 ORDER BY Location;
效果说明
- 完整的
Location字段分组会将AB02和AB02 - SW视为两个独立分组; - 标准化后的OS会把所有包含"Windows 7"的OS值统一为"Windows 7",同理处理Windows 10;
COUNT(OS)会统计每个分组下的记录总数(如果原表中每条记录对应一台设备,这个统计就是你需要的合并后Count;如果原表已有Count字段存储数量,改用SUM(Count)即可)。
执行这个查询后,就能得到你想要的结果:
Location OS Count AB02 Windows 7 81 AB02 - SW Windows 10 62
内容的提问来源于stack exchange,提问作者Tug Strongly
相关产品推荐
相关产品推荐

