PIVOT converts rows into columns, often to create cross-tab reports, while UNPIVOT converts columns back into rows for data normalization. They are invaluable in reporting, dashboards, and analytics workflows.
CASE statements for cross-tab layouts.SELECT *
FROM (
SELECT Product, Quarter, Amount
FROM Sales
) AS SourceTable
PIVOT (
SUM(Amount)
FOR Quarter IN ([Q1], [Q2])
) AS PivotTable;
SELECT
Product,
SUM(CASE WHEN Quarter = 'Q1' THEN Amount ELSE 0 END) AS Q1,
SUM(CASE WHEN Quarter = 'Q2' THEN Amount ELSE 0 END) AS Q2
FROM Sales
GROUP BY Product;
CASE + GROUP BY pattern works universally when native PIVOT is unavailable.SELECT Product, Quarter, Amount
FROM SalesPivot
UNPIVOT (
Amount FOR Quarter IN ([Q1], [Q2])
) AS UnpivotTable;
SELECT *
FROM (
SELECT emp_id, month, salary
FROM salaries
) AS s
PIVOT (
SUM(salary) FOR month IN ([Jan], [Feb], [Mar], [Apr])
) AS SalaryPivot;
| Operation | Transforms | Common Use Cases | Supported In |
|---|---|---|---|
| PIVOT | Rows β Columns | Dashboards, KPI scorecards, cross-tab summaries | SQL Server, Oracle (native) |
| UNPIVOT | Columns β Rows | Data warehousing, ETL, normalization | SQL Server, Oracle (native) |
| Manual PIVOT | Rows β Columns | Systems without PIVOT |
PostgreSQL, MySQL via CASE logic |
CASE expressions.β