If your solution is bad then anything we suggest may not be better, e.g.
SELECT b.BoxId,
MAX(CASE WHEN w.parameter = 1 THEN w.field1 END) AS [value1],
MAX(CASE WHEN w.parameter = 2 THEN w.field1 END) AS [value2],
MAX(CASE WHEN w.parameter = 3 THEN w.field1 END) AS [value3],
MAX(CASE WHEN w.parameter = 4 THEN w.field1 END) AS [value4]
FROM boxes b
LEFT OUTER JOIN widgets w ON w.boxid = b.boxid
GROUP BY b.BoxId
But the performance may be worse
Far away is close at hand in the images of elsewhere.
Anon.