TSQL Challenge 21 - Solution By leonid koyfman



--leonid_koyfman_tsqlchallenge_21.sql
;WITH Map (digit,code)
AS(	SELECT ' ',SPACE(9)		UNION ALL
	SELECT '0',' _ | ||_|'	UNION ALL SELECT '1','     |  |' UNION ALL
	SELECT '2',' _  _||_ '	UNION ALL SELECT '3',' _  _| _|' UNION ALL
	SELECT '4','   |_|  |'	UNION ALL SELECT '5',' _ |_  _|' UNION ALL
	SELECT '6',' _ |_ |_|'	UNION ALL SELECT '7',' _   |  |' UNION ALL
	SELECT '8',' _ |_||_|'	UNION ALL SELECT '9',' _ |_| _|'
)
SELECT 
	id
,	ScanNumber=ISNULL(CAST([value]as varchar(max)),'')
FROM 
	@t t1
CROSS APPLY
(	
	SELECT	[*]=ISNULL(Map.digit,'X')
	FROM	@t t2
	CROSS APPLY(SELECT	CrLf		=	NCHAR(13)+NCHAR(10))NL
	CROSS APPLY(SELECT	lineLength	=	CHARINDEX	(CrLf,ScanNumber, 1			)-1	)p1
	CROSS APPLY(SELECT	line2start	=	lineLength + 3								)p2
	CROSS APPLY(SELECT	line3start	=	line2start + lineLength +2					)p3
	CROSS APPLY(SELECT	line1		=	LEFT		(ScanNumber				,lineLength))l1
	CROSS APPLY(SELECT	line2		=	SUBSTRING	(ScanNumber,line2start	,lineLength))l2
	CROSS APPLY(SELECT	line3		=	SUBSTRING	(ScanNumber,line3start	,lineLength))l3
	CROSS APPLY(SELECT	code		=	SUBSTRING	(line1,N*3-2,3)+
										SUBSTRING	(line2,N*3-2,3)+
										SUBSTRING	(line3,N*3-2,3)
				FROM	(	SELECT	Number
							FROM	master..spt_values			
							WHERE	Number BETWEEN 1 AND lineLength/3 --length of ScanNumber
							AND		type='P'
						)Numbers(N)
				)d
	LEFT JOIN	Map  ON d.code=Map.code
	WHERE t2.id=t1.id
	FOR XML PATH(''),type
)T([value])
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.