Self join * base_table student subject grade ------- ---------- ----- Fred reading A Fred writing B Fred arithmetic C Mary reading B Mary writing B Mary arithmetic C CREATE VIEW pivot_table AS SELECT a.student AS student, b.grade AS reading, c.grade AS writing, d.grade AS arithmetic FROM (SELECT DISTINCT(student) FROM base_table) a INNER JOIN (SELECT student,grade FROM base_table WHERE subject='reading') b ON b.student=a.student INNER JOIN (SELECT student,grade FROM base_table WHERE subject='writing') c ON c.student = a.student INNER JOIN (SELECT student,grade FROM base_table WHERE subject='arithmetic') d ON d.student = a.student; * pivot_table student reading writing arithmetic ------- ------- ------- ---------- Fred A B C Mary B B C /* What if you add a new subject? */ /* Performance? */