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);Note
“crosstab() creates actual pivot tables. Requires tablefunc extension. Dynamic pivots need dynamic SQL.