#sql #oracle #unpivot
#sql #Oracle #отключить
Вопрос:
У меня есть запрос, который возвращает таблицу, которая выглядит примерно так, как показано ниже.
На изображении я хочу, чтобы входная таблица выглядела как выходная таблица —
По сути, я хочу, чтобы все данные из столбцов были перенесены в строки. Но я не хочу преобразовывать строки в столбцы.
Я видел решения для переноса строк и столбцов, но хотел проверить, есть ли что-то более простое, о чем кто-либо знает. Любая помощь приветствуется!
TIA
Комментарии:
1. Каков
hour
ваш ожидаемый результат?2. @Sujitmohanty30, это будут столбцы [0][1][2][3][4] из входной таблицы, которая будет преобразована в строки.
3. вы проверили решение? Сработало ли это?
4. Да, это сработало. Мне пришлось внести некоторые изменения, но я понял идею. Спасибо!
Ответ №1:
Как вы уже знаете, требуется преобразовать rows
в columns
PIVOT
, аналогично для преобразования columns
в rows
нам нужно UNPIVOT
.
Поскольку не существует конкретной таблицы с указанными именами столбцов, я использовал WITH
предложение для создания временной таблицы для демонстрации. Вот ссылка, чтобы узнать больше о предложениях, используемых в UNPIVOT
для вашей справки.
with table1
as
(
select 'Inbound' department, 50 hour0, 44 hour1, 29 hour2, 47 hour3, 17 hour4 from dual
union all
select 'Outbound', 6, 4, 10, 24, 39 from dual
union all
select 'Returns', 3, 1, 39, 43, 35 from dual
)
select *
from table1 t1
unpivot (value for hour in (hour0 as '0',hour1 as '1',hour2 as '2',hour3 as '3',hour4 as '4'))
Ответ №2:
В Oracle я бы рекомендовал использовать боковое соединение для отключения таблицы. Предполагая, что столбцы называются hour0
, hour1
, hour2
, …, это будет выглядеть как:
select t.department, x.*
from mytable t
cross apply (
select 0 as hour, t.hour0 as value from dual
union all select 1, t.hour1 from dual
union all select 2, t.hour2 from dual
union all ...
) x