TSQL Challenge 21 - Solution By Ruchay Sohawan



--Ruchay_Sohawan_tsqlchallenge_21.sql
/*******************************************************************
	Name:	 Ruchay Sohawan
	Date:	 2010/01/25
	Purpose: Convert numbers from scanner to customer numbers
*******************************************************************/


;WITH NumCTE(ScanId, ScanNumber, CustNum, LineLen, Incr1, Incr2, Incr3) AS 
(
    SELECT	ID, 
			ScanNumber, 
			CAST('' AS VARCHAR(MAX)) as CustNum, 
			CHARINDEX(CHAR(13) + CHAR (10),ScanNumber) AS LineLen, -- Used to control recursive part
			1 as Incr1,												-- Start position of first line										 
			CHARINDEX(CHAR(13) + CHAR (10),ScanNumber)+2 as Incr2,	--Start position of second line	
			CHARINDEX(CHAR(13) + CHAR (10),ScanNumber, CHARINDEX(CHAR(13) + CHAR (10),ScanNumber) +2)+2 as Incr3 --Start position of third line
    FROM @t
    UNION ALL
    SELECT	ScanID, 
			ScanNumber, 
			CAST(CustNum + 
				CASE SUBSTRING(ScanNumber,Incr1,3) + SUBSTRING(ScanNumber, Incr2,3) + SUBSTRING(ScanNumber, Incr3 ,3) 
					WHEN '         ' THEN ' '
					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'
					ELSE 'X'
				END 
			AS VARCHAR(MAX)) as CustNum,
		LineLen, 
		Incr1 + 3,
		Incr2 + 3,
		Incr3 + 3
    FROM NumCTE
	WHERE Incr1 <= LineLen-1 -- Stopping value
)
SELECT ScanId,  CustNum
FROM NumCTE
WHERE Incr1 >= LineLen
ORDER BY ScanID

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.