PolarDB for PostgreSQL(Compatible with Oracle) supports the PIVOT syntax. You can obtain cross table results for all your queries by using PIVOT. The result of a cross table query has more columns and fewer rows than that of a general query.

Syntax

SELECT ....
FROM <table-expr>
   PIVOT
     (
      aggregate-function(<column>) AS <alias>
      FOR <pivot-column> IN (<value1>, <value2>,..., <valuen>)
        ) AS <alias>
WHERE .....

Examples

Create a sample database.

CREATE TABLE SalesOrder
(
  shop VARCHAR(50),
  product VARCHAR(50),
  sales INT
);
insert into SalesOrder values('shopA', 'A', 10);
insert into SalesOrder values('shopA', 'B', 23);
insert into SalesOrder values('shopA', 'B', 63);
insert into SalesOrder values('shopA', 'B', 75);
insert into SalesOrder values('shopA', 'C', 39);
insert into SalesOrder values('shopB', 'A', 25);
insert into SalesOrder values('shopB', 'A', 43);
insert into SalesOrder values('shopB', 'C', 86);
insert into SalesOrder values('shopB', 'C', 33);
insert into SalesOrder values('shopC', 'B', 93);
insert into SalesOrder values('shopC', 'B', 92);
insert into SalesOrder values('shopC', 'B', 27);
insert into SalesOrder values('shopC', 'B', 6);
insert into SalesOrder values('shopC', 'C', 79);
  • Execute a general query.
    select * from SalesOrder pivot(sum(sales) for product in ('A', 'B'));

    The following result is returned:

     shop  | 'A' | 'B' 
    -------+-----+-----
     shopC |     | 218
     shopB |  68 |    
     shopA |  10 | 161
    (3 rows)
  • Execute a cross table query.
    select *
    from (select shop, product, sales
          from SalesOrder
          where sales>10)
    pivot(sum(sales) for product in ('A', 'B'));

    The following result is returned:

     shop  | 'A' | 'B' 
    -------+-----+-----
     shopC |     | 212
     shopB |  68 |    
     shopA |     | 161
    (3 rows)