I’m trying to create an excel-like pivot table with 3 columns of information, order tpye, product code, and the income generated from that order.
I’ve managed to get the generated income for every order from the same product, ordered by the order tpye.
select ORDER_TYPE, PRODUCT_CODE, sum(INCOME)
from Logistics
group by ORDER_TYPE, PRODUCT_CODE
order by ORDER_TYPE;
A fragment from the output query:
ORDER_TYPE, PRODUCT_CODE, sum(INCOME):
EB ZOL 432919
EB ITA 24832674
EB ELM 2095035
EB FRI 1464608
EB ESZ 0
EB GON 1707758
EB PVE 23130
EK FRI 10560880
EK ITA 30207062
EK PVE 1625576
EK ESZ 0
EK ZOL 1467432
EK GON 11208618
EK ELM 14159542
ER PVE -12449
ER ITA -3808222
ER ELM -236587
ER ZOL -17394
ER GON -16758710
ER FRI -102844
ER ESZ -104169
ER 33142
ES ZOL 13883
ES FRI -12860
ES ELM -107442
ES SZO -46800
ES PVE 0
ES GON 0
ES ITA -61427
E1 ELM 29195518
As you can see I have now a couple of rows for every order type because of the differenct products.
How can I modify this query to get a pivot table which has the columns for every order type and the rows for the product codes, so I only have one column for the order types instead of rows?
For example:
EB EK ES ER
ZOL income datas
ITA for every
ELM cell
FRI
ESZ
GON
PVE
FRI
Advertisement
Answer
You tagged Oracle18c so this should work for your version. I tested this on 11g.
SELECT *
FROM (
SELECT product_code, order_type, income
FROM Logistics
)
PIVOT (
sum(income)
for order_type
IN ('EB' AS EB, 'ER' AS ER, 'ES' AS ES, 'EK' AS EK)
);
This does require the set for the IN list to be filled in prior to execution. There is another syntax that allows a sub select but it returns XML. If you try to replace PIVOT XML with PIVOT it gives an error.
WITH orderTypes AS
(
select 'EB' as order_type from dual union all
select 'ER' as order_type from dual union all
select 'ES' as order_type from dual union all
select 'EK' as order_type from dual union all
select 'AA' as order_type from dual union all
select 'AB' as order_type from dual union all
select 'AC' as order_type from dual union all
select 'AD' as order_type from dual union all
select 'AE' as order_type from dual
)
SELECT *
FROM (
SELECT l.product_code, l.order_type, l.income
FROM Logistics l
)
PIVOT XML (
sum(income) AS orderSum
for order_type
IN ( select order_type from orderTypes)
);