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

如何按位置与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:29:44