Thinking about this some more though, perhaps *sorting* the columns is the wrong way to be thinking about it. Perhaps a better approach would be to allow the columns to be *listed* (optionally, using a separate query). Something like the following (don't get too hung up on the syntax):
SELECT name, to_char(date, 'Mon') AS month, sum(amount) AS amount FROM invoices GROUP BY 1,2 ORDER BY name \crosstabview cols = (select to_char(d, 'Mon') from generate_series('2000-01-01'::date, '2000-12-01', '1 month') d)
The idea is ok, but this design cannot be described as user friendly. The work with time dimension is pretty common, and should be supported by some short user friendly syntax.