Использование поворота на нескольких столбцах строки Oracle

У меня есть следующие примеры данных в таблице Oracle (tab1), и я пытаюсь преобразовать строки в столбцы. Я знаю, как использовать Oracle pivot в одном столбце. Но можно ли применить его к нескольким столбцам?

Пример данных:

Type  weight  height  
A     50      10  
A     60      12  
B     40      8  
C     30      15  

Мой предполагаемый выход:

A-count B-count C-count A-weight B-weight C-weight A-height B-height C-height  
2       1       1       110      40       30       22       8        15  

Что я могу сделать:

with T AS 
(select type, weight from tab1 )
select * from T
PIVOT (
count(type)
for type in (A, B, C, D,E,F)
)  

Вышеприведенный запрос дает мне следующий результат

A B C  
2 1 1  

Я могу заменить count(*) на sum(weight) или sum(height) на поворот высоты или веса. То, что я ищу, но я не могу сделать, является поворотным для всех трех (количество, вес и высота) в одном запросе.

Это может быть сделано с помощью шарнира?

Ответ 1

Как документация показывает, вы можете иметь несколько агрегатных функций. Итак, вы можете сделать это:

select * from (
  select * from tab1
)
pivot (
  count(type) as ct, sum(weight) as wt, sum(height) as ht
  for type in ('A' as A, 'B' as B, 'C' as C)
);

A_CT A_WT A_HT B_CT B_WT B_HT C_CT C_WT C_HT
---- ---- ---- ---- ---- ---- ---- ---- ----
   2  110   22    1   40    8    1   30   15 

Если вам нужны столбцы в указанном порядке, добавьте еще один уровень подзапроса:

select a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht
from (
  select * from (
    select * from tab1
  )
  pivot (
    count(type) as ct, sum(weight) as wt, sum(height) as ht
    for type in ('A' as A, 'B' as B, 'C' as C)
  )
);

A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT
---- ---- ---- ---- ---- ---- ---- ---- ----
   2    1    1  110   40   30   22    8   15 

SQL Fiddle.

Ответ 2

Второй подход к именам столбцов еще лучше и решает больше проблем. У меня было требование, в котором я хотел бы суммировать данные, возвращаемые из PIVOT, поэтому, имея имена столбцов, я мог просто добавить 2 и получить требуемый результат в третьем -

выберите a_ct, b_ct, c_ct, a_wt, b_wt, c_wt, a_ht, b_ht, c_ht, a_wt + b_wt + c_wt tot_wt из (выберите * из (выберите * из tab1) круг (количество (тип) как ct, сумму (вес) как wt, sum (высота) как ht для типа в ("A" как A, "B" как B, "C" как C)));

A_CT B_CT C_CT A_WT B_WT C_WT A_HT B_HT C_HT TOT_WT


2 1 1 110 40 30 22 8 15 180

Просто имейте в виду, что агрегатные функции (например, sum) не будут работать должным образом, если один из используемых столбцов PIVOT вернет null, в этом случае я использовал оператор CASE, чтобы обойти это.

Надеюсь, это кому-нибудь поможет.