我需要用于计算一些数字的公式
(1)在特定数字的每个数字中加3
(2)如果我们将10、11、12等两位数字相加后得到结果,则仅考虑最后一位数字
例如,如果数字为564843530,则enter code here
新数字将是897176023。
答案 0 :(得分:2)
解决方案:
DECLARE @number int
SET @number = 564843530;
WITH DigitsTable AS
(
SELECT 0 AS Power10, ABS(@Number) AS Number
UNION ALL
SELECT Power10 + 1, Number / 10
FROM DigitsTable
WHERE Number > 10
)
SELECT SUM((((Number % 10) + 3) % 10) * POWER(10, Power10)) AS NewNumber
FROM DigitsTable
OPTION (MAXRECURSION 0);
输出:
897176863
说明:
此答案基于一个递归CTE,该CTE返回每个当前数字,新数字和乘数进行计算:
DECLARE @number int
SET @number = 564843530;
WITH DigitsTable AS
(
SELECT 0 AS Power10, ABS(@Number) AS Number
UNION ALL
SELECT Power10 + 1, Number / 10
FROM DigitsTable
WHERE Number > 10
)
SELECT
Power10,
Number % 10 AS Digit,
((Number % 10) + 3) % 10 AS NewDigit,
POWER(10, Power10) AS Multiplier
FROM DigitsTable
OPTION (MAXRECURSION 0);
递归CTE的输出:
Power10 Digit NewDigit Multiplier
0 0 3 1
1 3 6 10
2 5 8 100
3 3 6 1000
4 4 7 10000
5 8 1 100000
6 4 7 1000000
7 6 9 10000000
8 5 8 100000000
答案 1 :(得分:1)
为此:
SELECT
(
SELECT RIGHT(SUBSTRING(DS.[number], v.[number] + 1, 1) + 3, 1)
FROM
(
SELECT '564843530'
) DS ([number])
INNER JOIN [master]..spt_values v on v.[number] < LEN(DS.[number])
WHERE V.[type] = 'P'
ORDER BY v.[number]
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)');
算法很简单:
这应该在旧版本上有效。如果您使用的是SQL Server 2016
,则可以使用STRING_SPLIT
中的STRING_AGG
和SQL Server 2017
之类的功能。
对于较旧的版本,您可以查找SQL CLR函数,以便编写自己的函数以进行拆分和连接。例如,在我的系统中,我可以这样做:
如果对SQL CLR感兴趣,请检查以下link。
答案 2 :(得分:0)
假设OP提供的示例值是错误的(如我的评论“ 564843530
不会变成897176863
?5 + 3 = (1)0
和{{ 1}}?” ),那么这就是我的方法,该方法使用了NGrams8k:
3 + 3 = 2
答案 3 :(得分:0)
尝试一下
DECLARE @n int, @inc int;
SELECT @n = 564843530, @inc = 3;
WITH t1(n, m, k, p)
AS (
SELECT @n AS n, CAST(0 AS int) AS m, CAST(0 AS int) AS k, CAST(0 AS bigint) AS p
UNION ALL
SELECT n / 10 AS n, n - round(n, -1, 1) AS m, k + 1 AS k, CAST(power(10, k) AS bigint) AS p
FROM t1 WHERE n > 0
)
SELECT SUM((CASE WHEN m > 10 - @inc THEN m - 10 + @inc ELSE m + @inc END) * p)
FROM t1
结果
897176863