如何用SQL统计列中每个distinct值的出现次数
列值逐值计数的实现方法
要统计单列中每个distinct值的出现次数,核心逻辑是基于目标列做分组聚合。全局聚合查询如果没有分组逻辑,永远只会返回单行的全局统计值,无法拆分输出每个值的单独计数。
基础查询语句
SELECT Col1, COUNT(Col1) AS occurrence_count FROM table1 GROUP BY Col1;
语句执行逻辑:
GROUP BY Col1会将表中Col1取值完全相同的行划归为同一个独立分组- 聚合函数会针对每个分组单独计算,最终每个Col1值对应输出一行结果,实现逐值计数的目标。
原有写法的问题说明
之前使用的
SELECT COUNT(DISTINCT(Col1)) FROM table1属于无分组的全局聚合查询:整表会被当成一个独立分组,最终只会返回1行结果——也就是所有去重值的总个数。无论怎么调整SELECT后的参数,只要没有添加GROUP BY Col1的分组逻辑,查询都不会拆分输出每个值的单独计数。
匹配目标展示格式的写法
如果需要直接输出值: 出现次数格式的结果,可以在查询中拼接两个字段的内容,以MySQL为例的写法:
SELECT CONCAT(Col1, ': ', COUNT(Col1)) AS 统计结果 FROM table1 GROUP BY Col1;
使用题目给出的Col1样例数据执行后,输出结果为:
AA: 3 AB: 1 AC: 2 AD: 1 AE: 1
和期望格式完全一致。
注意事项
- 如果需要统计列中的NULL值计数,需要把
COUNT(Col1)替换为COUNT(*):因为COUNT(字段名)会跳过字段值为NULL的行,而COUNT(*)会统计分组内所有行的总数,包含字段为NULL的情况 - 该写法符合SQL标准,可在所有主流数据库中运行,在开启严格GROUP BY模式的执行环境中也不会触发语法错误
内容的提问来源于stack exchange,提问作者Mus
相关产品推荐
相关产品推荐

