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

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的问题对应

  1. 第一段独立子查询写法:子查询没有和外层分组的app_name、app_version做关联,统计的是全表范围的计数值,不是当前分组下的结果,所以所有分组返回的数值完全一致。
  2. 第二段条件计数写法:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:09:28