try the below query, Used CTE
here. I just used first 3 or 4 CTEs to generate master data, you can change it as per your table structure.
WITH AUTOMOBILES
AS (
SELECT 1 ID,'BMW M3' Name
UNION
SELECT 2,'Ferrari F 430'
), OPTIONS
AS (
SELECT 1 ID,'Color' Name
UNION
SELECT 2,'Year'
UNION
SELECT 3,'Top Speed'
),AM_VALUES
AS (
SELECT 1 ID,1 AutomobileID,1 OptionID,'Black' Value
union
select 2,1,1,'Red'
union
select 3,1,1,'Blue'
union
select 4,1,2,'2010'
union
select 5,1,2,'2011'
union
select 6,2,1,'Yellow'
union
select 7,2,1,'white'
union
select 8,2,2,'2012'
union
select 9,2,2,'2013'
union
select 10,2,3,'Sp210'
union
select 11,2,3,'Sp190'
),INPUT_TABLE
AS (
SELECT V.ID,V.AutomobileID,A.Name Car,V.OptionID,O.Name, V.Value
,DENSE_RANK() OVER(PARTITION BY V.AutomobileID ORDER BY V.OptionID ) AS OptionRowNo
FROM AM_VALUES AS V
INNER JOIN AUTOMOBILES AS A ON A.ID = V.AutomobileID
INNER JOIN OPTIONS AS O ON O.ID = V.OptionID
),VTREE
AS (
SELECT DISTINCT AutomobileID,ID AS Node,NULL AS Parent,OptionRowNo,CAST(Value AS nvarchar) AS Value,1 RowNo
FROM INPUT_TABLE
WHERE OptionRowNo = 1
UNION ALL
SELECT V.AutomobileID,I.ID,V.Node,I.OptionRowNo,CAST(V.Value+' '+I.Value AS nvarchar),RowNo=RowNo+1
FROM VTREE AS V
INNER JOIN INPUT_TABLE AS I ON I.AutomobileID = V.AutomobileID
AND I.OptionRowNo > V.OptionRowNo
)
SELECT AutomobileID,Value
FROM VTREE AS V
WHERE RowNo = ( SELECT TOP 1 COUNT(DISTINCT I1.OptionID)
FROM INPUT_TABLE AS I1
WHERE I1.AutomobileID = V.AutomobileID
GROUP BY I1.AutomobileID)
ORDER BY AutomobileID,Value
Output:-
AutomobileID Value
1 Black 2010
1 Black 2011
1 Blue 2010
1 Blue 2011
1 Red 2010
1 Red 2011
2 white 2012 Sp190
2 white 2012 Sp210
2 white 2013 Sp190
2 white 2013 Sp210
2 Yellow 2012 Sp190
2 Yellow 2012 Sp210
2 Yellow 2013 Sp190
2 Yellow 2013 Sp210