如何在MS SQL中统计字符串内各字母出现次数并生成结果表
在MS SQL中统计字符串各字母出现次数的实现方案
嘿,这个需求我之前刚好处理过,给你两种在MS SQL里能直接跑通的实现方式,完美匹配你要的统计结果!
方法1:利用数字辅助表拆分字符统计
这种方法先生成一个和输入字符串长度匹配的数字序列,逐个截取字符后分组计数,逻辑清晰易懂:
DECLARE @InputStr NVARCHAR(100) = 'BROWNSEA ISLAND'; -- 生成递归数字序列,覆盖字符串的每个字符位置 WITH NumCTE AS ( SELECT 1 AS Num UNION ALL SELECT Num + 1 FROM NumCTE WHERE Num < LEN(@InputStr) ) SELECT UPPER(SUBSTRING(@InputStr, Num, 1)) AS [Letter], COUNT(*) AS [Count] FROM NumCTE WHERE SUBSTRING(@InputStr, Num, 1) <> ' ' -- 过滤掉空格 GROUP BY UPPER(SUBSTRING(@InputStr, Num, 1)) ORDER BY [Letter];
说明
- 用递归CTE生成1到字符串长度的数字,帮我们定位每个字符的位置
UPPER()是为了统一统计大小写(如果需要区分大小写,直接去掉这个函数就行)- 过滤掉空格是因为示例短语里有空格,不需要统计它的次数
方法2:递归CTE逐字符拆分统计
这种方法用递归的方式逐个提取字符串里的字符,适合不想依赖额外辅助表的场景:
DECLARE @InputStr NVARCHAR(100) = 'BROWNSEA ISLAND'; WITH CharCTE AS ( -- 初始化:提取第一个字符 SELECT 1 AS Position, UPPER(SUBSTRING(@InputStr, 1, 1)) AS [Letter] WHERE LEN(@InputStr) >= 1 UNION ALL -- 递归:逐个提取后续字符 SELECT Position + 1, UPPER(SUBSTRING(@InputStr, Position + 1, 1)) AS [Letter] FROM CharCTE WHERE Position < LEN(@InputStr) ) SELECT [Letter], COUNT(*) AS [Count] FROM CharCTE WHERE [Letter] <> ' ' -- 过滤空格 GROUP BY [Letter] ORDER BY [Letter];
说明
- 递归CTE从第一个字符开始,每次递归推进一个位置,直到遍历完整个字符串
- 同样支持大小写统一或区分,按需调整
UPPER()即可
两种方法运行后,都会输出你要的结果:比如B:1、R:1、N:2、S:2等,完全符合示例要求。
内容的提问来源于stack exchange,提问作者Osprey
相关产品推荐
相关产品推荐

