TSQL Challenge 21 - Solution By andrey myasnikov



--andrey_myasnikov_tsqlchallenge_21_v1.sql
;WITH CTE (ID,ScanNumber,DigID,[Value])
AS
(SELECT	ID, 
		ScanNumber,	
		0 as DigID,  -- Sequential number of a digit in the ScanNumber string
		CAST('' as VARCHAR(MAX)) as [Value]
FROM @t

UNION ALL

SELECT	CTE.ID,
		CTE.ScanNumber,
		CTE.DigID+1,
		CTE.[Value] + 
		CASE
		CAST(
				(	SUBSTRING(CTE.ScanNumber, 3*CTE.DigID+1, 3)+  -- Line 1 of a digit number DigID
					SUBSTRING(CTE.ScanNumber, 3*CTE.DigID+CHARINDEX(CHAR(13),CTE.ScanNumber)+2, 3)+  -- Line 2 of a digit number DigID
					SUBSTRING(CTE.ScanNumber, 3*CTE.DigID+CHARINDEX(CHAR(13),CTE.ScanNumber)*2+3, 3) -- Line 3 of a digit number DigID
			 ) as VARCHAR(MAX)   
			)
			WHEN ' _ | ||_|' THEN '0'
			WHEN '     |  |' THEN '1'
			WHEN ' _  _||_ ' THEN '2'
			WHEN ' _  _| _|' THEN '3'
			WHEN '   |_|  |' THEN '4'
			WHEN ' _ |_  _|' THEN '5'
			WHEN ' _ |_ |_|' THEN '6'
			WHEN ' _   |  |' THEN '7'
			WHEN ' _ |_||_|' THEN '8'
			WHEN ' _ |_| _|' THEN '9'
			WHEN '         ' THEN ' '
			ELSE 'X' END

FROM CTE 
WHERE CTE.DigID < CHARINDEX(CHAR(13),CTE.ScanNumber) / 3)  -- Limit to number of digits in the string

SELECT ID,[Value]
FROM CTE
WHERE DigID = CHARINDEX(CHAR(13),ScanNumber) / 3  -- Return fully populated values only
ORDER BY ID, [Value]

Did you find something incorrect/wrong with this solution? Take a few seconds to Report It.

Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this solution.