• 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.