Использование поворота на нескольких столбцах строки 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, чтобы обойти это.
Надеюсь, это кому-нибудь поможет.