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
相关产品推荐
相关产品推荐

