如何将值的总和计算为单个数字值 [英] How to calculate the sum of a value as a single digit value

查看:144
本文介绍了如何将值的总和计算为单个数字值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的存储过程中,我在表格中输出单个值作为输出。



例如



数据

====

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 avoid 0 (zeros) in case of sum of digits is equal 9 ;)
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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆