TSQL Challenge 21 - Solution By regan wick



--regan_wick_tsqlchallenge_21_v4.sql
SELECT
	 Id
	,Value
FROM
	@t ScanNumbers
	CROSS APPLY
		(
		SELECT REPLACE(REPLACE((SELECT
			ISNULL(Value,'X') AS [data()]
		FROM
			(
			SELECT 
				 Id
				,number
				,SUBSTRING(ScanNumber,(0 * DigitCount * 3) + 1 + ((number - 1) * 3),3) + 
				 SUBSTRING(ScanNumber,(1 * DigitCount * 3) + 1 + ((number - 1) * 3),3) + 
				 SUBSTRING(ScanNumber,(2 * DigitCount * 3) + 1 + ((number - 1) * 3),3) AS Digit
			FROM
				(
				SELECT
					 --clean up ScanNumber and calculate digit count
					 Id
					,REPLACE(REPLACE(ScanNumber,CHAR(10),''),CHAR(13),'')		AS ScanNumber
					,FLOOR(CHARINDEX(CHAR(13),ScanNumber) / 3)					AS DigitCount
				FROM
					@t
				) Data1
				CROSS JOIN [master].[dbo].[spt_values] 
			WHERE
				type	= 'P'
			AND	number	BETWEEN 1 AND DigitCount
			AND Id		= ScanNumbers.Id
			) Scans
			LEFT OUTER JOIN
			(
			SELECT
				 ' _ | ||_|'	AS NumStr
				,'0'			AS Value
			UNION ALL
			SELECT
				 '     |  |'	AS  NumStr
				,'1'			AS Value
			UNION ALL
			SELECT
				 ' _  _||_ '	AS NumStr
				,'2'			AS Value
			UNION ALL
			SELECT
				 ' _  _| _|'	AS NumStr
				,'3'			AS Value
			UNION ALL
			SELECT
				 '   |_|  |'	AS NumStr
				,'4'			AS Value
			UNION ALL
			SELECT
				 ' _ |_  _|'	AS NumStr
				,'5'			AS Value
			UNION ALL
			SELECT
				 ' _ |_ |_|' 	AS NumStr
				,'6'			AS Value
			UNION ALL
			SELECT
				 ' _   |  |' 	AS NumStr
				,'7'			AS Value
			UNION ALL
			SELECT
				 ' _ |_||_|' 	AS NumStr
				,'8'			AS Value
			UNION ALL
			SELECT
				 ' _ |_| _|'	AS NumStr
				,'9'			AS Value
			UNION ALL
			SELECT
				 '         '	AS NumStr
				,'S'			AS Value
			) Nums
				ON Scans.Digit = Nums.NumStr
		ORDER BY
			number
		FOR XML PATH ('')),' ',''),'S',' ') AS Value
		) Data3
ORDER BY
	Id

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.