• Cadavre (10/16/2013)


    I don't fully understand what you actually want here, it's always easier to figure out when you supply us with DDL, readily consumable sample data and expected results based on the sample data. Here's my shot in the dark.

    First, this is the sample data I used to test with: -

    -- Set up readily consumable sample data so that we can test any solution

    IF object_id('tempdb..#testEnvironment') IS NOT NULL

    BEGIN;

    DROP TABLE #testEnvironment;

    END;

    SELECT [Column 1], [Column 2], [Column 3], [Column 4]

    INTO #testEnvironment

    FROM (VALUES('Base',16369,14499,NULL),

    (NULL,14499,14498,'Level 1'),

    (NULL,14498,14371,'Level 2'),

    (NULL,14371,234,'Level 3'),

    (NULL,234,225,'Level 4'),

    (NULL,225,1,'Level 5'),

    (NULL,1,0,'Level 6')

    )a([Column 1], [Column 2], [Column 3], [Column 4]);

    Here's my attempted solution: -

    DECLARE @ORDER BIT = 0, @SQL NVARCHAR(MAX);

    IF @ORDER = 0

    BEGIN;

    -- ORDER BASE TO LEAF

    WITH CTE AS

    (

    SELECT [Column 1], [Column 2], [Column 3], ISNULL([Column 4],[Column 1]) AS [Column 4],

    1 AS Pos

    FROM #testEnvironment

    WHERE [Column 1] = 'Base'

    UNION ALL

    SELECT a.[Column 1], a.[Column 2], a.[Column 3], a.[Column 4], Pos + 1

    FROM #testEnvironment a

    INNER JOIN CTE b ON b.[Column 3] = a.[Column 2]

    )

    SELECT @SQL = 'SELECT '+

    STUFF((SELECT ','+CHAR(13)+CHAR(10)+

    CHAR(39)+[Column 4]+CHAR(39)+' AS [Column '+CAST(Pos AS VARCHAR(3))+']'

    FROM CTE

    ORDER BY Pos ASC

    FOR XML PATH(''),TYPE

    ).value('.','NVARCHAR(MAX)'),1,1,''

    );

    END;

    ELSE IF @ORDER = 1

    BEGIN;

    -- ORDER LEAF BASE

    WITH CTE AS

    (

    SELECT [Column 1], [Column 2], [Column 3], ISNULL([Column 4],[Column 1]) AS [Column 4],

    1 AS Pos

    FROM #testEnvironment

    WHERE [Column 1] = 'Base'

    UNION ALL

    SELECT a.[Column 1], a.[Column 2], a.[Column 3], a.[Column 4], Pos + 1

    FROM #testEnvironment a

    INNER JOIN CTE b ON b.[Column 3] = a.[Column 2]

    )

    SELECT @SQL = 'SELECT '+

    STUFF((SELECT ','+CHAR(13)+CHAR(10)+

    CHAR(39)+[Column 4]+CHAR(39)+' AS [Column '+CAST(Pos AS VARCHAR(3))+']'

    FROM CTE

    ORDER BY Pos DESC

    FOR XML PATH(''),TYPE

    ).value('.','NVARCHAR(MAX)'),1,1,''

    );

    END;

    EXECUTE sp_executesql @SQL;

    That results in: -

    Column 1 Column 2 Column 3 Column 4 Column 5 Column 6 Column 7

    -------- -------- -------- -------- -------- -------- --------

    Base Level 1 Level 2 Level 3 Level 4 Level 5 Level 6

    If you change the @ORDER to 1, then it results in: -

    Column 7 Column 6 Column 5 Column 4 Column 3 Column 2 Column 1

    -------- -------- -------- -------- -------- -------- --------

    Level 6 Level 5 Level 4 Level 3 Level 2 Level 1 Base

    Sorry guys if my message was not that clear and havent put the DDL. 🙁

    Cadavre, yes you hit it right! I wanted the result you've posted. But the solution will work for a single record. What if I wanted it on a multiple records?

    Change the value of the record to make it more understandable.

    DDL:

    IF object_id('tempdb..#testEnvironment') IS NOT NULL

    BEGIN;

    DROP TABLE #testEnvironment;

    END;

    SELECT [Car], [Child], [Parent], [Category_Name]

    INTO #testEnvironment

    FROM (VALUES('Type R',16369,14499,NULL),

    (NULL,14499,14498,'Civic'),

    (NULL,14498,14371,'Manual Transmission'),

    (NULL,14371,234,'2013'),

    (NULL,234,225,'Gasoline'),

    (NULL,225,1,'Passenger Car'),

    (NULL,1,0,'Honda'),

    ('SX 2.0',17273,6267,NULL),

    (NULL,6267,6265,'CRV'),

    (NULL,6265,6264,'Automatic Transmission'),

    (NULL,6264,234,'2013'),

    (NULL,234,6199,'Diesel'),

    (NULL,6199,1,'SUV'),

    (NULL,1,0,'Honda')

    )a([Car], [Child], [Parent], [Category_Name]);

    The result I wanted is:

    Car Type Category 1 Category 2 Category 3 Category 4 Category 5 Category6

    Type R Civic Manual Transmission 2013 Gasoline Pasenger Car Honda

    SX 2.0 CRV Automatic Transmission 2013 Diesel SUV Honda

    Basically the records with "NULL" value on [Car] column are the categories and the records with "NULL" values on [Category_Name] are the root.