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

SQL实现数字各位迭代求和至单个数字:脚本故障排查

解决数字迭代求和到单个数字的问题

嘿,我来帮你搞定这个数字根计算的问题!先看看你的原脚本哪里出了问题,再给你两种靠谱的解法。

原脚本的问题分析

你的思路方向是对的,但有几个关键问题导致脚本无法正常运行:

  • 长度计算错误:你用了DATALENGTH(@maxValue)来确定数字的位数,但DATALENGTH返回的是int类型的字节数(比如709090作为int是4字节),而不是数字的实际字符长度,应该用LEN(CAST(numbers AS VARCHAR(1000)))来获取每个数字的真实位数。
  • 未关联单个数字:原CTE里没有按每个数字分组求和,导致把所有数字的各位加在了一起,而不是单独计算每个数字的和。
  • 迭代逻辑不完整:finalsum只处理了两位数字的求和,如果第一次求和是个位数或者三位数,都会出错,而且没有循环迭代到得到单个数字。

解法1:修正原思路的迭代求和法

这个方法基于你的原始思路,修正了问题并加入递归迭代,确保最终得到单个数字:

DECLARE @t TABLE(numbers INT)
INSERT INTO @t SELECT 794 UNION ALL SELECT 709090

-- 先计算每个数字的初始各位和,再递归迭代到单个数字
;WITH DigitSum AS (
    SELECT 
        numbers,
        SUM(CAST(SUBSTRING(CAST(numbers AS VARCHAR(1000)), n.number, 1) AS INT)) AS current_sum
    FROM @t
    CROSS APPLY (
        SELECT number 
        FROM MASTER..SPT_VALUES 
        WHERE type = 'P' -- 只取正数序列,过滤无关记录
          AND number > 0 
          AND number <= LEN(CAST(numbers AS VARCHAR(1000)))
    ) n
    GROUP BY numbers
),
IterativeSum AS (
    SELECT 
        numbers,
        current_sum,
        CASE WHEN current_sum < 10 THEN current_sum ELSE NULL END AS final_sum
    FROM DigitSum
    UNION ALL
    SELECT 
        numbers,
        SUM(CAST(SUBSTRING(CAST(current_sum AS VARCHAR(1000)), n.number, 1) AS INT)) AS current_sum,
        CASE WHEN SUM(CAST(SUBSTRING(CAST(current_sum AS VARCHAR(1000)), n.number, 1) AS INT)) < 10 THEN SUM(CAST(SUBSTRING(CAST(current_sum AS VARCHAR(1000)), n.number, 1) AS INT)) ELSE NULL END AS final_sum
    FROM IterativeSum
    CROSS APPLY (
        SELECT number 
        FROM MASTER..SPT_VALUES 
        WHERE type = 'P'
          AND number > 0 
          AND number <= LEN(CAST(current_sum AS VARCHAR(1000)))
    ) n
    WHERE final_sum IS NULL
    GROUP BY numbers, current_sum
)
SELECT numbers, final_sum AS digital_root
FROM IterativeSum
WHERE final_sum IS NOT NULL

解法2:高效的数学公式法

其实这个问题有个数学捷径——数字根公式,不需要字符串操作和递归,直接计算:

  • 如果数字是0,结果为0
  • 如果数字能被9整除且不为0,结果为9
  • 否则结果为数字模9的余数

对应的脚本非常简洁:

DECLARE @t TABLE(numbers INT)
INSERT INTO @t SELECT 794 UNION ALL SELECT 709090

SELECT 
    numbers,
    CASE 
        WHEN numbers = 0 THEN 0
        WHEN numbers % 9 = 0 THEN 9
        ELSE numbers % 9
    END AS digital_root
FROM @t

运行这个脚本,你会直接得到正确结果:794的数字根是2,709090的数字根是7,完全符合你的需求。

内容的提问来源于stack exchange,提问作者priyanka.sarkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:44:31