如何在SQL Server中统计列内唯一数据数量并生成带键值的索引结果
SQL Server 统计指定列唯一值出现次数并输出指定格式
核心实现逻辑
先对目标列做分组计数,再将统计结果拼接为要求的键值对字符串格式,直接替换代码中的自定义表名、列名即可使用。
版本兼容写法
1. SQL Server 2017及以上版本(支持STRING_AGG函数)
DECLARE @result_str VARCHAR(MAX) SELECT @result_str = CONCAT('array = [', -- 可通过修改第二个参数调整分隔符,改为';'即可用分号分隔键值对 STRING_AGG(CONCAT(your_target_column, '=', COUNT(*)), ',') WITHIN GROUP (ORDER BY COUNT(*) DESC, your_target_column), ']') FROM your_table -- 按需添加过滤条件,比如排除NULL值、指定时间范围等 WHERE your_target_column IS NOT NULL GROUP BY your_target_column SELECT @result_str AS final_output
2. SQL Server 2016及更早版本(无STRING_AGG,用FOR XML PATH实现拼接)
DECLARE @result_str VARCHAR(MAX) SET @result_str = 'array = [' SELECT @result_str = @result_str + CONCAT(your_target_column, '=', cnt, ',') FROM ( -- 先做分组计数 SELECT your_target_column, COUNT(*) AS cnt FROM your_table WHERE your_target_column IS NOT NULL GROUP BY your_target_column ) t -- 按计数降序、键值升序排序,和高版本逻辑保持一致 ORDER BY t.cnt DESC, t.your_target_column -- 处理无数据的边界情况,避免截取字符串报错 IF @result_str = 'array = [' SET @result_str = 'array = []' ELSE -- 去掉末尾多余的逗号,补全右括号 SET @result_str = LEFT(@result_str, LEN(@result_str) - 1) + ']' SELECT @result_str AS final_output
注意事项
- 如果目标列是非字符串类型(数值、日期等),需要先转为字符串再拼接,避免类型转换报错,示例:
CAST(your_target_column AS VARCHAR(50)) - 可灵活调整统计规则:如果需要保留NULL值的统计,可去掉
WHERE your_target_column IS NOT NULL的过滤条件,同时对NULL值做替换,示例:ISNULL(CAST(your_target_column AS VARCHAR(50)), 'NULL') - 如果需要调整键值对的分隔符,可直接修改
STRING_AGG的第二个参数,或修改低版本代码中拼接的逗号即可
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

