TSQL Challenge 21 - Solution By Philippe Pimenta



--Philippe_Pimenta_tsqlchallenge_21.sql
WITH Test(Id,Line1, Line2, Line3, Value, LastItem) AS
(
	SELECT Id, LEFT(ScanNumber,posline1-1), SUBSTRING(ScanNumber, posline1+1,posline2-posline1-1),SUBSTRING(ScanNumber, posline2+1,posline3-posline2-1),
	CAST('' AS VARCHAR(1000)) as Value,
	0 AS LastItem
	FROM (
	SELECT Id,ScanNumber,
	CHARINDEX(CHAR(10),ScanNumber) as posline1,
	CHARINDEX(CHAR(10),ScanNumber,CHARINDEX(CHAR(10),ScanNumber)+1) as posline2,
	CHARINDEX(CHAR(10),ScanNumber,CHARINDEX(CHAR(10),ScanNumber,CHARINDEX(CHAR(10),ScanNumber)+1)+1) as posline3
	FROM @t) a
	UNION ALL
	SELECT Test.Id,SUBSTRING(Test.Line1, 4, LEN(Test.Line1)-3), SUBSTRING(Test.Line2, 4, LEN(Test.Line2)-3), SUBSTRING(Test.Line3, 4, LEN(Test.Line3)-3),
		CONVERT(VARCHAR(1000),Value + 
			CASE 
			WHEN LEFT(Test.Line1,3) = '   ' /* 1 or 4 or empty*/ THEN
				CASE WHEN LEFT(Test.Line2,3) = '  |' THEN
						CASE WHEN LEFT(Test.Line3,3)='  |' THEN '1' ELSE 'X' END
					 WHEN LEFT(Test.Line2,3) = '|_|' THEN
						CASE WHEN LEFT(Test.Line3,3)='  |' THEN '4' ELSE 'X' END
					 WHEN LEFT(Test.Line2,3) = '   ' THEN
						CASE WHEN LEFT(Test.Line3,3)='   ' THEN ' ' ELSE 'X' END
					 ELSE 'X'
				END
			WHEN LEFT(Test.Line1,3) = ' _ ' THEN/* other */ 
				CASE
					WHEN LEFT(Test.Line2,3) = '| |' THEN /*0*/
						CASE WHEN  LEFT(Test.Line3,3)='|_|' THEN '0'
						ELSE 'X'
						END
					 WHEN LEFT(Test.Line2,3) = ' _|' THEN /*2 or 3*/
						CASE WHEN  LEFT(Test.Line3,3)='|_ ' THEN '2'
							 WHEN  LEFT(Test.Line3,3)=' _|' THEN '3'
						ELSE 'X'
						END
					WHEN LEFT(Test.Line2,3) = '|_ ' THEN /*5 or 6*/
						CASE WHEN  LEFT(Test.Line3,3)=' _|' THEN '5'
							 WHEN  LEFT(Test.Line3,3)='|_|' THEN '6'
						ELSE 'X'
						END

					WHEN LEFT(Test.Line2,3) = '|_|' THEN /* 8 or 9 */
					 CASE WHEN LEFT(Test.Line3,3)='|_|'  THEN '8'  /*8*/
						  WHEN LEFT(Test.Line3,3)=' _|'  THEN '9'  /*9*/
					 ELSE 'X'
					 END
					WHEN LEFT(Test.Line2,3) = '  |' AND LEFT(Test.Line3,3)='  |'  THEN '7' /*7*/ 
				ELSE 'X'
				END
			ELSE 'X'
			END
			),
		CASE WHEN LEN(Test.Line1) <6 THEN 1 ELSE 0 END AS LastItem
	FROM Test
	WHERE LEN(Test.Line1)>=3
)
SELECT Id,Value FROM Test WHERE LastItem = 1
ORDER BY 1

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.