try this which displays ids only, if u want description also change the code accordinglyDROP TABLE #TableDECLARE @T TABLE (GOODID INT, Type VARCHAR(100), FGOODID INT)INSERT @TSELECT 1, 'ElectricalSets', null UNION ALLSELECT 2, 'Satelite', 1 UNION ALLSELECT 3, 'Satelite Dish', 2 UNION ALLSELECT 4, 'CottonProducts', null UNION ALLSELECT 5, 'Satelite Receiver', 2; WITH Cte ( GoodId, FGoodId, Parent, Lvl)AS( SELECT GoodId, FGoodId, GoodId, CAST(1 AS INT) FROM @T WHERE FGoodId IS NULL UNION ALL SELECT T.GoodId, T.FGoodId, C.Parent, C.Lvl + 1 FROM @T T INNER JOIN Cte C ON C.GoodId = T.FGoodId)SELECT *, ROW_NUMBER() OVER (PARTITION BY FGoodId, Parent ORDER BY FGoodId, Parent) AS 'RowSeq' , MAX(Lvl) OVER (PARTITION BY Parent) AS 'ColSeq'INTO #TableFROM CteDECLARE @StrCols VARCHAR(MAX), @StrFinalCols VARCHAR(MAX), @Str VARCHAR(MAX) SELECT @StrCols = '', @StrFinalCols = '', @Str = '' SELECT @StrCols = @StrCols + ', MAX(CASE WHEN Lvl = ' + Lvl + ' THEN GoodId END) AS "GoodId' + Lvl + '"', @StrFinalCols = @StrFinalCols + ',' + CASE WHEN ColSeq = 1 THEN 'GoodId' + Lvl ELSE 'CASE WHEN GoodId' + Lvl + ' IS NOT NULL THEN GoodId' + Lvl + ' ELSE (SELECT GoodId FROM #Table WHERE RowSeq = 1 AND Parent = A.Parent AND Lvl = ' + Lvl + ') END AS "GoodId' + Lvl + '"' ENDFROM ( SELECT DISTINCT CONVERT(VARCHAR(10), Lvl) AS 'Lvl', CASE WHEN Lvl = ColSeq AND ColSeq <> 1 THEN 1 ELSE 0 END as ColSeq FROM #Table ) ASELECT @StrFinalCols = STUFF(@StrFinalCols, 1, 1, '')SELECT @Str = 'SELECT ' + @StrFinalCols +' FROM ( SELECT RowSeq, Parent ' + @StrCols + ' FROM #Table GROUP BY RowSeq, Parent ) A'EXEC(@Str)
"There is only one difference between a dream and an aim.A dream requires soundless sleep to see,whereas an aim requires sleepless efforts to achieve..!!"