Oracle создает сводную таблицу из 3 столбцов - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь создать сводную таблицу в стиле Excel с 3 столбцами информации, типом заказа, кодом продукта и доходом, полученным от этого заказа.

Мне удалось получить полученный доход.для каждого заказа из того же продукта, упорядоченного по заказу tpye.

select ORDER_TYPE, PRODUCT_CODE, sum(INCOME)
from Logistics
group by ORDER_TYPE, PRODUCT_CODE
order by ORDER_TYPE;

Фрагмент из выходного запроса:

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

Как видите, у меня теперь есть пара строкдля каждого типа заказа из-за различных продуктов.

Как изменить этот запрос, чтобы получить сводную таблицу, в которой есть столбцы для каждого типа заказа и строки для кодов продуктов, поэтому у меня есть только один столбец для типов заказа вместо строк?

Например:

    EB    EK    ES    ER
ZOL income datas
ITA for every
ELM cell
FRI 
ESZ 
GON 
PVE 
FRI 

Ответы [ 3 ]

1 голос
/ 31 марта 2019

Использовать функцию сводной таблицы, как определено в Oracle SQL https://oracle -base.com / статьи / 11g / шарнирные-и-UNPIVOT-операторы-11gR1

1 голос
/ 31 марта 2019

Вы пометили Oracle18c, так что это должно работать для вашей версии. Я проверял это на 11 г.

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)
);

Для этого требуется, чтобы набор для списка IN был заполнен до выполнения. Существует еще один синтаксис, который допускает подвыбор, но возвращает XML. Если вы попытаетесь заменить PIVOT XML на PIVOT, это выдаст ошибку.

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)
);
1 голос
/ 31 марта 2019

вариант использования, когда

select PRODUCT_CODE,(case when ORDER_TYPE='EB' then s_income end) as EB,
sum(case when ORDER_TYPE='Ek' then income else 0 end) as EK,
sum(case when ORDER_TYPE='ES' then income else 0  end) as ES,
sum(case when ORDER_TYPE='ER' then income else 0  end) as ER
from Logistics group by PRODUCT_CODE
...