SELECT m.id,
COALESCE(a.SomeValue, 0) AS f1,
COALESCE(b.SomeValue, 0) AS f2,
COALESCE(c.SomeValue, 0) AS f3,
COALESCE(d.SomeValue, 0) AS f4,
COALESCE(e.SomeValue, 0) AS f5,
COALESCE(f.SomeValue, 0) AS f6,
COALESCE(g.SomeValue, 0) AS f7
FROM mastertable AS m
LEFT JOIN childtable AS a ON m.id=a.ForeignKey_to_master AND a.WhichColumn=1
LEFT JOIN childtable AS b ON m.id=b.ForeignKey_to_master AND b.WhichColumn=2
LEFT JOIN childtable AS c ON m.id=c.ForeignKey_to_master AND c.WhichColumn=3
LEFT JOIN childtable AS d ON m.id=d.ForeignKey_to_master AND d.WhichColumn=4
LEFT JOIN childtable AS e ON m.id=e.ForeignKey_to_master AND e.WhichColumn=5
LEFT JOIN childtable AS f ON m.id=f.ForeignKey_to_master AND f.WhichColumn=6
LEFT JOIN childtable AS g ON m.id=g.ForeignKey_to_master AND g.WhichColumn=7
If the predominant "Value" is really a "0", and they are completely unimportant to be stored, it would also reduce the Data-Volume stored by a significant factor.
The main difference between the "multi-table" and "single-table" approach is
1) adding/reducing the number of "Columns" --> if you want to display 8 Columns, you would have to create a table for the 8th column in multi-table. In the single-table approach you don't. You just change the Query
--> NotaBene: In both approaches you have to change your Query, adding the 8th Column in the Select as well as adding the 8th LEFT JOIN
2) Use of Parameters! the single-table-approach allows full use of parameters, in case you want to display only a specific column
SELECT m.id,
COALESCE(CAST(a.WhichColumn AS CHAR), 'Column not found') AS wc,
COALESCE(a.SomeValue, 0) AS f1
FROM mastertable AS m
LEFT JOIN childtable AS a ON m.id=a.ForeignKey_to_master AND a.WhichColumn=:pParamCol