PIVOT Function in Oracle
The Oracle PIVOT clause allows you to write a cross-tabulation query starting in Oracle 11g. This means that you can aggregate your results and rotate rows into columns.
Syntax
The syntax for the PIVOT clause in Oracle/PLSQL is:
SELECT * FROM ( SELECT column1, column2 FROM tables WHERE conditions ) PIVOT ( aggregate_function(column2) FOR column2 IN ( expr1, expr2, ... expr_n) | subquery ) ORDER BY expression [ ASC | DESC ];
Parameters or Arguments
- aggregate_function
- It can be a function such as SUM, COUNT, MIN, MAX, or AVG functions.
- IN ( expr1, expr2, … expr_n )
- A list of values for column2 to pivot into headings in the cross-tabulation query results.
- subquery
- It can be used instead of a list of values. In this case, the results of the subquery would be used to determine the values for column2 to pivot into headings in the cross-tabulation query results.
Applies To
The PIVOT clause can be used in the following versions of Oracle/PLSQL:
- Oracle 12c, Oracle 11g
Example
Let’s look at how to use the PIVOT clause in Oracle.
We will base our example on a table called orders with the following definition:
CREATE TABLE orders ( order_id integer NOT NULL, customer_ref varchar2(50) NOT NULL, order_date date, product_id integer, quantity integer, CONSTRAINT orders_pk PRIMARY KEY (order_id) );
To show you the data for this example, we will select the records from the orders table with the following SELECT statement:
SELECT order_id, customer_ref, product_id FROM orders ORDER BY order_id;
These are the records in the orders table. We will be using these records to demonstrate how the PIVOT clause works:
order_id | customer_ref | product_id |
---|---|---|
50001 | SMITH | 10 |
50002 | SMITH | 20 |
50003 | ANDERSON | 30 |
50004 | ANDERSON | 40 |
50005 | JONES | 10 |
50006 | JONES | 20 |
50007 | SMITH | 20 |
50008 | SMITH | 10 |
50009 | SMITH | 20 |
Now, let’s create our cross-tabulation query using the following PIVOT clause:
SELECT * FROM ( SELECT customer_ref, product_id FROM orders ) PIVOT ( COUNT(product_id) FOR product_id IN (10, 20, 30) ) ORDER BY customer_ref;
In this example, the PIVOT clause would return the following results:
customer_ref | 10 | 20 | 30 |
---|---|---|---|
ANDERSON | 0 | 0 | 1 |
JONES | 1 | 1 | 0 |
SMITH | 2 | 3 | 0 |
This is how PIVOT works.
Top Posts
- RANK, DENSE_RANK, FIRST and LAST Analytic Functions
- Partitioned Tables And Indexes in Oracle
- GROUP BY Functions in Oracle
- Cardinality and Index in Oracle
- Oracle Architecture – SQL Query Processing