TSQL Challenge 21 - Solution By Muhammad AlPasha



--Muhammad_AlPasha_tsqlchallenge_21_V5.sql
WITH NumbersStrings(number, number_string) AS
(
   SELECT CAST(' ' AS CHAR(1)), CAST('         ' AS CHAR(9))
    UNION ALL
   SELECT CAST('0' AS CHAR(1)), CAST(' _ | ||_|' AS CHAR(9))
    UNION ALL
   SELECT CAST('1' AS CHAR(1)), CAST('     |  |' AS CHAR(9))
    UNION ALL
   SELECT CAST('2' AS CHAR(1)), CAST(' _  _||_ ' AS CHAR(9))
    UNION ALL
   SELECT CAST('3' AS CHAR(1)), CAST(' _  _| _|' AS CHAR(9))
    UNION ALL
   SELECT CAST('4' AS CHAR(1)), CAST('   |_|  |' AS CHAR(9))
    UNION ALL
   SELECT CAST('5' AS CHAR(1)), CAST(' _ |_  _|' AS CHAR(9))
    UNION ALL
   SELECT CAST('6' AS CHAR(1)), CAST(' _ |_ |_|' AS CHAR(9))
    UNION ALL
   SELECT CAST('7' AS CHAR(1)), CAST(' _   |  |' AS CHAR(9))
    UNION ALL
   SELECT CAST('8' AS CHAR(1)), CAST(' _ |_||_|' AS CHAR(9))
    UNION ALL
   SELECT CAST('9' AS CHAR(1)), CAST(' _ |_| _|' AS CHAR(9))
)
, ScanNumbersWithOffsets AS
(
   SELECT Id, ScanNumber, 1 AS offset1, CHARINDEX(CHAR(10), ScanNumber) + 1 AS offset2,
          2 * CHARINDEX(CHAR(10), ScanNumber) + 1 AS offset3, CHARINDEX(CHAR(10), ScanNumber) / 3 AS number_count
     FROM (SELECT Id, CAST(ScanNumber AS VARCHAR(8000)) AS ScanNumber
             FROM @t) AS T
)
, ScanNumberStrings AS
(
   SELECT SN.Id, SN.ScanNumber, SN.offset1, SN.offset2, SN.offset3, SN.number_count, 9 AS sequence,
          CAST('' AS VARCHAR(8000)) +
             CASE SN.number_count
                  WHEN 0 THEN ''
                  WHEN 1 THEN ISNULL(NS1.number, 'X')
                  WHEN 2 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X')
                  WHEN 3 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X')
                  WHEN 4 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X') + ISNULL(NS4.number, 'X')
                  WHEN 5 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X') + ISNULL(NS4.number, 'X') + ISNULL(NS5.number, 'X')
                  WHEN 6 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X') + ISNULL(NS4.number, 'X') + ISNULL(NS5.number, 'X') +
                              ISNULL(NS6.number, 'X')
                  WHEN 7 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X') + ISNULL(NS4.number, 'X') + ISNULL(NS5.number, 'X') +
                              ISNULL(NS6.number, 'X') + ISNULL(NS7.number, 'X')
                  WHEN 8 THEN ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X') + ISNULL(NS4.number, 'X') + ISNULL(NS5.number, 'X') +
                              ISNULL(NS6.number, 'X') + ISNULL(NS7.number, 'X') + ISNULL(NS8.number, 'X')
                  ELSE ISNULL(NS1.number, 'X') + ISNULL(NS2.number, 'X') + ISNULL(NS3.number, 'X') + ISNULL(NS4.number, 'X') + ISNULL(NS5.number, 'X') +
                       ISNULL(NS6.number, 'X') + ISNULL(NS7.number, 'X') + ISNULL(NS8.number, 'X') + ISNULL(NS9.number, 'X')
             END AS value
     FROM ScanNumbersWithOffsets AS SN
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3, 3)) AS NS1
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3, 3)) AS NS2
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 2, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 2, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 2, 3)) AS NS3
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 3, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 3, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 3, 3)) AS NS4
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 4, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 4, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 4, 3)) AS NS5
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 5, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 5, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 5, 3)) AS NS6
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 6, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 6, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 6, 3)) AS NS7
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 7, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 7, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 7, 3)) AS NS8
          OUTER APPLY
          (SELECT NS.number
             FROM NumbersStrings AS NS
            WHERE NS.number_string = SUBSTRING(SN.ScanNumber, SN.offset1 + 3 * 8, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset2 + 3 * 8, 3) +
                                     SUBSTRING(SN.ScanNumber, SN.offset3 + 3 * 8, 3)) AS NS9

    UNION ALL

   SELECT Id, ScanNumber, offset1, offset2, offset3, number_count, sequence + 1, value + ISNULL(number, 'X')
     FROM ScanNumberStrings AS SNS
          OUTER APPLY
          (SELECT number
             FROM NumbersStrings
            WHERE number_string = SUBSTRING(ScanNumber, offset1 + 3 * sequence, 3) + SUBSTRING(ScanNumber, offset2 + 3 * sequence, 3) + SUBSTRING(ScanNumber, offset3 + 3 * sequence, 3)
              AND sequence <= number_count) AS NS
    WHERE sequence < number_count
)
SELECT Id, value
  FROM ScanNumberStrings
 WHERE sequence >= number_count
 ORDER BY Id
OPTION(MAXRECURSION 0,MAXDOP 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.