如何将值的总和计算为单个数字值 [英] How to calculate the sum of a value as a single digit value
问题描述
在我的存储过程中,我在表格中输出单个值作为输出。
例如
数据
====
55
(即)在我的表中数据我得到55作为输出。
我的要求是以单个数字得到我的输出总和。
55- - > 5 + 5 = 10 - > 1 + 0 - > 1
我想要1作为我的输出。如何在查询中实现这一点。
尝试投出9个点数[ ^ ] !!!
返回除以9的余数:
SELECT ABS( 列 )% 9 FROM 表
基于3.解决方案,正确的sql代码是:
DECLARE @ tmp 表(ID INT IDENTITY ( 1 , 1 ),val VARCHAR ( 30 ))
INSERT INTO @ tmp (val )
SELECT ' 1' AS val
UNION ALL SELECT ' 22' AS val
UNION ALL SELECT ' 333' AS val
UNION ALL SELECT ' 4444' AS val
< span class =code-keyword> UNION ALL SELECT ' 55555' AS val
SELECT val, CASE WHEN CastingOutNines = 0 那么 9 ELSE CastingOutNines < span class =code-keyword> END AS SumOfDigits
FROM (
SELECT val,ABS( CONVERT ( INT ,val))% 9 AS CastingOutNines
FROM @ tmp
) AS T
结果:
val SumOfDigits
1 1
22 4
333 9
4444 7
55555 7
为什么?为了避免0
(零),如果数字总和等于9
;)
3 + 3 + 3 = 9
另一种方法是使用常用表格表达式 [ ^ ]:
DECLARE @ myFirstSums TABLE (ID INT , val NVARCHAR ( 30 ),SumOfDigits INT )
; WITH myValues AS
(
SELECT ID,val, CONVERT ( INT , LEFT (val, 1 )) AS newVal, RIGHT (val,LEN(val) - 1) AS 剩余
FROM @ tmp
WHERE LEN(val)> = 1
UNION < span class =code-keyword> ALL
SELECT ID,val, CONVERT ( INT , LEFT (剩余, 1 )) AS newVal, RIGHT (剩余,LEN(剩余)-1) AS 剩余
FROM myValues
WHERE LEN(剩余)> = 1
UNION ALL
SELECT ID,val, CONVERT ( INT ,剩余) AS newVal, NULL AS 剩余
FROM myValues
WHERE LEN(剩余)= 0
)
INSERT INTO @ myFirstSums ( ID,val,SumOfDigits)
SELECT ID,val,SUM(newVal) AS SumOfDigits
FROM myValues
GROUP BY ID,val
ORDER BY ID,val
; WITH mySums AS
(
SELECT ID,val,SumOfDigits, CONVERT ( INT , LEFT ( CONVERT ( VARCHAR ( 10 ),SumOfDigits), 1 )) AS newVal, RIGHT ( CONVERT ( VARCHAR ( 10 ),SumOfDigits),LEN( CONVERT ( VARCHAR ( 10 ),SumOfDigits)) - 1) AS 剩余
FROM @ myFirstSums
WHERE LEN( CONVERT ( VARCHAR ( 10 ),SumOfDigits))> = 1
UNION ALL
SELECT ID,val,SumOfDigits, CONVERT ( INT , LEFT (剩余, 1 )) AS newVal, RIGHT (剩余,LEN(剩余)-1) AS 剩余
FROM mySums
WHERE LEN(余数)> ; = 1
UNION ALL
SELECT ID,val,SumOfDigits, CONVERT ( INT ,Remainder) AS newVal, NULL AS 剩余
FROM mySums
WHERE LEN(剩余)= 0
)
SELECT ID,val,SUM(newVal) AS SumOfDigits
FROM mySums
GROUP BY ID,val
结果相同;)
警告!以上示例(使用CTE)仅支持数字总和小于100时的数字;)
也许这个帮助您请尝试以下查询。
DECLARE @数字 INT
DECLARE @计数 INT = 0
DECLARE @ Count1 INT = 0
DECLARE @ Intnum INT = 55
DECLARE @ intFlag INT = 1
WHILE ( @ intFlag < ; = LEN( @ IntNum ))
BEGIN
SET @ Number = SUBSTRING(CAST( @ Intnum AS VARCHAR (max)), @ intFlag ,< span class =code-digit> 1 )
SET @ Count = @ Count + @ Number
SET @ intFlag = @ intFlag + 1
END
IF LEN( @ Count )> 1
BEGIN
DECLARE @ intFlag1 INT = 1
WHILE (LEN( @ Count1 )= 1 )
BEGIN
SET @ Number = SUBSTRING(CAST( @ Count AS VARCHAR (max)), @ intFlag1 , 1 )
SET @ Count1 = @ Count1 + @ Number
S ET @ intFlag1 = @ intFlag1 + 1
IF LEN( @ Count )+ 1 = @ intFlag1
BREAK
ELSE
CONTINUE
结束
END
SELECT @ Count1 AS ' 计数'跨度>
In my Stored Procedure my getting single value as Output in a table.
For Example
Data
====
55
(ie)In my table Data Im getting 55 as output.
My requirement is to get the sum of my output in single digit.
55--> 5+5=10-->1+0-->1
I want 1 as my output.How to achieve this in a query.
Try Casting out nines[^]!!!
Return the remainder of dividing by 9:
SELECT ABS(column) % 9 FROM table
Based on 3. solution, the correct sql code is:
DECLARE @tmp TABLE (ID INT IDENTITY(1,1), val VARCHAR(30)) INSERT INTO @tmp (val) SELECT '1' AS val UNION ALL SELECT '22' AS val UNION ALL SELECT '333' AS val UNION ALL SELECT '4444' AS val UNION ALL SELECT '55555' AS val SELECT val, CASE WHEN CastingOutNines=0 THEN 9 ELSE CastingOutNines END AS SumOfDigits FROM ( SELECT val, ABS(CONVERT(INT, val)) % 9 AS CastingOutNines FROM @tmp ) AS T
Result:
val SumOfDigits 1 1 22 4 333 9 4444 7 55555 7
Why? To avoid0
(zeros) in case of sum of digits is equal9
;)
3+3+3=9
Another way is to use Common Table Expressions[^]:
DECLARE @myFirstSums TABLE(ID INT, val NVARCHAR(30), SumOfDigits INT) ;WITH myValues AS ( SELECT ID, val, CONVERT(INT, LEFT(val,1)) AS newVal, RIGHT(val, LEN(val)-1) AS Remainder FROM @tmp WHERE LEN(val)>=1 UNION ALL SELECT ID, val, CONVERT(INT, LEFT(Remainder,1)) AS newVal, RIGHT(Remainder, LEN(Remainder)-1) AS Remainder FROM myValues WHERE LEN(Remainder)>=1 UNION ALL SELECT ID, val, CONVERT(INT, Remainder) AS newVal, NULL AS Remainder FROM myValues WHERE LEN(Remainder)=0 ) INSERT INTO @myFirstSums (ID, val, SumOfDigits) SELECT ID, val, SUM(newVal) AS SumOfDigits FROM myValues GROUP BY ID, val ORDER BY ID, val ;WITH mySums AS ( SELECT ID, val, SumOfDigits, CONVERT(INT, LEFT(CONVERT(VARCHAR(10),SumOfDigits),1)) AS newVal, RIGHT(CONVERT(VARCHAR(10),SumOfDigits), LEN(CONVERT(VARCHAR(10),SumOfDigits))-1) AS Remainder FROM @myFirstSums WHERE LEN(CONVERT(VARCHAR(10),SumOfDigits))>=1 UNION ALL SELECT ID, val, SumOfDigits, CONVERT(INT, LEFT(Remainder,1)) AS newVal, RIGHT(Remainder, LEN(Remainder)-1) AS Remainder FROM mySums WHERE LEN(Remainder)>=1 UNION ALL SELECT ID, val, SumOfDigits, CONVERT(INT, Remainder) AS newVal, NULL AS Remainder FROM mySums WHERE LEN(Remainder)=0 ) SELECT ID, val, SUM(newVal) AS SumOfDigits FROM mySums GROUP BY ID, val
The result is the same ;)
Warning! Above example (using CTE) supports only the numbers when the sum of digits is less than 100 ;)
Maybe this Help you please try the following query.
DECLARE @Number INT DECLARE @Count INT = 0 DECLARE @Count1 INT = 0 DECLARE @Intnum INT = 55 DECLARE @intFlag INT = 1 WHILE (@intFlag <= LEN(@IntNum)) BEGIN SET @Number = SUBSTRING(CAST(@Intnum AS VARCHAR(max)), @intFlag, 1) SET @Count = @Count + @Number SET @intFlag = @intFlag + 1 END IF LEN(@Count) > 1 BEGIN DECLARE @intFlag1 INT = 1 WHILE (LEN(@Count1) = 1) BEGIN SET @Number = SUBSTRING(CAST(@Count AS VARCHAR(max)), @intFlag1, 1) SET @Count1 = @Count1 + @Number SET @intFlag1 = @intFlag1 + 1 IF LEN(@Count) + 1 = @intFlag1 BREAK ELSE CONTINUE END END SELECT @Count1 AS 'Count'
这篇关于如何将值的总和计算为单个数字值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!