If you want separate columns for each 12 spec name and value the this could also do the thing:
IF OBJECT_ID('MyTable','U') IS NOT NULL
DROP TABLE MyTable
GO
CREATE TABLE MyTable
(
ItemID INT,
ItemName VARCHAR(30),
SpecName VARCHAR(30),
SpecValue VARCHAR(30)
)
GO
INSERT INTO MyTable
(ItemID, ItemName, SpecName, SpecValue)
VALUES (1, 'Item1', 'Item1Spec1', 'Item1Value1'),
(1, 'Item1', 'Item1Spec2', 'Item1Value2'),
(1, 'Item1', 'Item1Spec3', 'Item1Value3'),
(1, 'Item1', 'Item1Spec4', 'Item1Value4'),
(2, 'Item2', 'Item2Spec1', 'Item2Value1'),
(2, 'Item2', 'Item2Spec2', 'Item2Value2'),
(3, 'Item3', 'Item3Spec1', 'Item3Value1'),
(3, 'Item3', 'Item3Spec2', 'Item3Value2'),
(3, 'Item3', 'Item3Spec3', 'Item3Value3'),
(4, 'Item4', 'Item4Spec1', 'Item4Value1')
SELECT ItemID,ItemName,
MAX(CASE WHEN ItemSpecNo = 1 THEN SpecName END) AS [spec1name],
MAX(CASE WHEN ItemSpecNo = 1 THEN SpecValue END) AS [spec1value],
MAX(CASE WHEN ItemSpecNo = 2 THEN SpecName END) AS [spec2name],
MAX(CASE WHEN ItemSpecNo = 2 THEN SpecValue END) AS [spec2value],
MAX(CASE WHEN ItemSpecNo = 3 THEN SpecName END) AS [spec3name],
MAX(CASE WHEN ItemSpecNo = 3 THEN SpecValue END) AS [spec3value],
MAX(CASE WHEN ItemSpecNo = 4 THEN SpecName END) AS [spec4name],
MAX(CASE WHEN ItemSpecNo = 4 THEN SpecValue END) AS [spec4value],
MAX(CASE WHEN ItemSpecNo = 5 THEN SpecName END) AS [spec5name],
MAX(CASE WHEN ItemSpecNo = 5 THEN SpecValue END) AS [spec5value],
MAX(CASE WHEN ItemSpecNo = 6 THEN SpecName END) AS [spec6name],
MAX(CASE WHEN ItemSpecNo = 6 THEN SpecValue END) AS [spec6value],
MAX(CASE WHEN ItemSpecNo = 7 THEN SpecName END) AS [spec7name],
MAX(CASE WHEN ItemSpecNo = 7 THEN SpecValue END) AS [spec7value],
MAX(CASE WHEN ItemSpecNo = 8 THEN SpecName END) AS [spec8name],
MAX(CASE WHEN ItemSpecNo = 8 THEN SpecValue END) AS [spec8value],
MAX(CASE WHEN ItemSpecNo = 9 THEN SpecName END) AS [spec9name],
MAX(CASE WHEN ItemSpecNo = 9 THEN SpecValue END) AS [spec9value],
MAX(CASE WHEN ItemSpecNo = 10 THEN SpecName END) AS [spec10name],
MAX(CASE WHEN ItemSpecNo = 10 THEN SpecValue END) AS [spec10value],
MAX(CASE WHEN ItemSpecNo = 11 THEN SpecName END) AS [spec11name],
MAX(CASE WHEN ItemSpecNo = 11 THEN SpecValue END) AS [spec11value],
MAX(CASE WHEN ItemSpecNo = 12 THEN SpecName END) AS [spec12name],
MAX(CASE WHEN ItemSpecNo = 12 THEN SpecValue END) AS [spec12value]
FROM
(
SELECT *,ROW_NUMBER()OVER (PARTITION BY itemID ORDER BY itemID) AS ItemSpecNo FROM MyTable
) t
GROUP BY ItemID,ItemName