SQL

Pivot Without PIVOT (Conditional Aggregation)

admin by @admin ADMIN
Jun 15, 2026
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Most databases don't have a real `PIVOT` keyword (SQL Server does). The portable answer is conditional aggregation — `SUM(CASE WHEN ...) AS col` for each pivoted value.
SQL
Raw
-- Source: monthly sales rows
--   month   | category | revenue
--   2025-01 | widgets  | 100
--   2025-01 | gizmos   | 200
--   2025-02 | widgets  | 150
--   ...

-- Pivot — one column per category
SELECT month,
       SUM(CASE WHEN category = 'widgets' THEN revenue END) AS widgets,
       SUM(CASE WHEN category = 'gizmos'  THEN revenue END) AS gizmos,
       SUM(CASE WHEN category = 'gadgets' THEN revenue END) AS gadgets,
       SUM(revenue)                                          AS total
FROM   sales
GROUP  BY month
ORDER  BY month;

-- Postgres FILTER syntax — same idea, cleaner
SELECT month,
       SUM(revenue) FILTER (WHERE category = 'widgets') AS widgets,
       SUM(revenue) FILTER (WHERE category = 'gizmos')  AS gizmos,
       SUM(revenue)                                      AS total
FROM   sales
GROUP  BY month;

-- For dynamic pivots (unknown column set at query time), reach for
-- the crosstab() function (PostgreSQL tablefunc extension) or build the
-- query string in your application.
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.