Performance of queries
  
  * compared three techniques :
  
  * self-join view:
      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
      ...
  
  *  aggregate view:
      CREATE VIEW pivot_table AS
      SELECT
          student,
          GROUP_CONCAT(CASE WHEN subject='reading' THEN grade ELSE NULL END) as reading,
          GROUP_CONCAT(CASE WHEN subject='writing' THEN grade ELSE NULL END) as writing,
      ...
      GROUP BY student
  
  *   virtual pivot table:
      CREATE VIRTUAL TABLE pivot_table
           USING perl ("SQLite::VirtualTable::Pivot", "base_table");