AdvancedAdvanced PostgreSQL

Pivot table using crosstab (tablefunc extension)

The query

SQL
-- Install extension
CREATE EXTENSION tablefunc;

-- Pivot: departments as rows, quarters as columns
SELECT *
FROM crosstab(
  'SELECT dept_name, quarter, SUM(salary)::NUMERIC
   FROM employees e
   JOIN departments d ON e.dept_id = d.dept_id
   CROSS JOIN (SELECT ''Q'' || EXTRACT(QUARTER FROM generate_series(
     ''2024-01-01''::DATE, ''2024-12-31''::DATE, ''3 months''::INTERVAL
   )) AS quarter) q
   GROUP BY dept_name, quarter
   ORDER BY 1, 2',
  $$VALUES ('Q1'), ('Q2'), ('Q3'), ('Q4')$$
) AS pivot_table(dept TEXT, q1 NUMERIC, q2 NUMERIC, q3 NUMERIC, q4 NUMERIC);
Tested against PostgreSQL 16

Note

crosstab() creates actual pivot tables. Requires tablefunc extension. Dynamic pivots need dynamic SQL.

Tables referenced