Click here to Skip to main content
15,885,244 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
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.
Posted

Try Casting out nines[^]!!!
Return the remainder of dividing by 9:
SQL
SELECT ABS(column) % 9 FROM table
 
Share this answer
 
v2
Comments
Maciej Los 26-Jun-13 17:13pm    
Perfect answer! See mine ;)
+5
Based on 3. solution, the correct sql code is:
SQL
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[^]:
SQL
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 ;)
 
Share this answer
 
v2
Comments
Raja Sekhar S 27-Jun-13 0:54am    
Awesome Answer.... Very Helpful.... +5 For your Answer..
Maciej Los 27-Jun-13 1:37am    
Thank you, Raja ;)
Raja Sekhar S 28-Jun-13 1:35am    
yw... Maciej Los...
Maybe this Help you please try the following query.


SQL
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'
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900