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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:37:38