MySQL如何统计唯一行分组下不同类型license的出现次数
MySQL 许可统计正确实现方案
核心修正逻辑
- 先对原表做去重处理,避免重复行导致计数虚高
- 分组维度严格按照要求同时指定
app_name、app_version两个字段 - 修正条件计数的写法错误,避免非目标行被计入统计
- 移除冗余的外层
DISTINCT,GROUP BY本身会返回唯一的分组维度组合
兼容XAMPP全MySQL版本的实现SQL
该写法兼容MySQL 5.x及以上版本,适配XAMPP默认部署环境:
SELECT app_name, app_version, SUM(CASE WHEN license NOT LIKE '%Commercial%' THEN 1 ELSE 0 END) AS oss_count, SUM(CASE WHEN license LIKE '%Commercial%' THEN 1 ELSE 0 END) AS commercial_count, COUNT(*) AS total FROM ( -- 内层子查询完成整行去重,若有自定义去重规则可调整此处逻辑 SELECT DISTINCT * FROM apps_components ) AS unique_app_records GROUP BY app_name, app_version;
写法说明
如果你的表存在自增主键、重复行需要按规则保留特定记录,可以替换内层去重子查询的逻辑;如果是完全重复的脏数据,
SELECT DISTINCT *的去重方式可以直接使用。
此前两段SQL的问题对应
- 第一段独立子查询写法:子查询没有和外层分组的
app_name、app_version做关联,统计的是全表范围的计数值,不是当前分组下的结果,所以所有分组返回的数值完全一致。 - 第二段条件计数写法:
GROUP BY仅指定app_name,同应用不同版本的数据会被合并统计,不符合分组维度要求COUNT(CASE WHEN ... THEN 1 ELSE 0 END)写法中,不满足条件的分支返回0,属于非NULL值,会被COUNT函数统计,最终计数结果等于分组总行数,无法区分许可类型。如果要使用COUNT实现条件计数,需要去掉ELSE分支,让不满足条件的行默认返回NULL,写法为COUNT(CASE WHEN license LIKE '%Commercial%' THEN 1 END),不满足条件的NULL值会被COUNT自动忽略。
内容的提问来源于stack exchange,提问作者CZend371
相关产品推荐
相关产品推荐

