• Here is a quick sample solution, much worse performance wise than Chris's but I put it forward more as an alternative method anyway.

    😎

    USE tempdb;

    GO

    ;WITH TDOC(

    [ID]

    ,[Customer name]

    ,[Customer address]

    ,[Product number]

    ,[Product name]

    ,[Quantity]

    ,[Price]

    ,[Product number2]

    ,[Product name2]

    ,[Quantity2]

    ,[Price2]

    )

    AS

    (

    SELECT

    [ID]

    ,[Customer name]

    ,[Customer address]

    ,[Product number]

    ,[Product name]

    ,[Quantity]

    ,[Price]

    ,[Product number2]

    ,[Product name2]

    ,[Quantity2]

    ,[Price2]

    FROM (VALUES

    (2, 'Andy' ,'Andy''s way 2',24,'Glue',3,35,39,'Oyster',2,9)

    ,(3, 'John' ,'Dandy''s way 4',15,'Slime',2,10,17,'Clan' ,4,12)

    ) AS X([ID]

    ,[Customer name]

    ,[Customer address]

    ,[Product number]

    ,[Product name]

    ,[Quantity]

    ,[Price]

    ,[Product number2]

    ,[Product name2]

    ,[Quantity2]

    ,[Price2])

    )

    ,CUSTOMER AS

    (

    SELECT

    T.ID AS COL_1

    ,T.[Customer name] AS COL_2

    ,T.[Customer address] AS COL_3

    ,NULL AS COL_4

    ,NULL AS COL_5

    FROM TDOC T

    )

    ,PRODUCT_1 AS

    (

    SELECT

    T.ID

    ,CONVERT(VARCHAR(25),T.[Product number],1) AS [Product number]

    ,T.[Product name]

    ,T.[Quantity]

    ,T.[Price]

    FROM TDOC T

    )

    ,PRODUCT_2 AS

    (

    SELECT

    T.ID

    ,CONVERT(VARCHAR(25),T.[Product number2],1) AS [Product number]

    ,T.[Product name2]

    ,T.[Quantity2]

    ,T.[Price2]

    FROM TDOC T

    )

    SELECT

    *

    FROM CUSTOMER C

    UNION ALL

    SELECT

    *

    FROM PRODUCT_1

    UNION ALL

    SELECT

    *

    FROM PRODUCT_2