Как перенести строку в столбцы в Oracle, как показано ниже, с помощью Unpivot?

#sql #database #oracle #oracle11g

Вопрос:

Исходная таблица

Категория Затрат Тип Категории Затрат 1 квартал-2020 2 квартал-2020 3 квартал-2020 4 квартал-2020
Сотрудник Пострадал Стоимость Периода 10 20 0 4000

Достигнутый Результат

Категория Затрат Тип Категории Затрат Квартал Год Ценность
Сотрудник Пострадал Стоимость Периода 1 квартал-2020 10
Сотрудник Пострадал Стоимость Периода 2 квартал-2020 20
Сотрудник Пострадал Стоимость Периода 3 квартал-2020 0
Сотрудник Пострадал Стоимость Периода 4 квартал-2020 4000

желаемый результат

Категория Затрат Тип Категории Затрат Квартал Год Четверть Год Ценность
Сотрудник Пострадал Стоимость Периода 1 квартал-2020 Q1 2020 10
Сотрудник Пострадал Стоимость Периода 2 квартал-2020 Q2 2020 20
Сотрудник Пострадал Стоимость Периода 3 квартал-2020 Q3 2020 0
Сотрудник Пострадал Стоимость Периода 4 квартал-2020 Q4 2020 4000

Я смог достичь таблицы 2 выше, используя приведенный ниже запрос, но не уверен, как добавить столбец за квартал и год, как показано в таблице 3

 with a (
  Cost_Category,
  Cost_Category_Type,
  Q1_2020,
  Q2_2020,
  Q3_2020,
  Q4_2020
) as (
  select
    'Employee Impacted',
    'Period Cost',
    ATTRIBUTE_34,
    ATTRIBUTE_35,
    ATTRIBUTE_36,
    ATTRIBUTE_37
  from view_form_539766
)
select *
from a
unpivot (
  value
  for Quarter_Year in (
    q1_2020 as 'Q1-2020',
    q2_2020 as 'Q2-2020',
    q3_2020 as 'Q3-2020',
    q4_2020 as 'Q4-2020',
    
  )
)
 

Ответ №1:

Используйте еще один CTE. Ваше текущее «решение» — temp CTE в моем запросе; тогда это простая задача-извлечь квартал и год.

 SQL> WITH
  2     a (cost_category,
  3        cost_category_type,
  4        q1_2020,
  5        q2_2020,
  6        q3_2020,
  7        q4_2020)
  8     AS
  9        (SELECT 'Employee Impacted', 'Period cost', 10, 20, 0, 4000 FROM DUAL),
 10     temp
 11     AS
 12        (SELECT *
 13           FROM a
 14                UNPIVOT (VALUE
 15                        FOR quarter_year
 16                        IN (q1_2020 AS 'Q1-2020',
 17                           q2_2020 AS 'Q2-2020',
 18                           q3_2020 AS 'Q3-2020',
 19                           q4_2020 AS 'Q4-2020')))
 20  SELECT t.cost_category,
 21         t.cost_category_type,
 22         t.quarter_year,
 23         SUBSTR (t.quarter_year, 1, 2) quarter,
 24         SUBSTR (t.quarter_year, 4) year,
 25         t.VALUE
 26    FROM temp t
 27  /

COST_CATEGORY     COST_CATEGO QUARTER QUARTER  YEAR      VALUE
----------------- ----------- ------- -------- ---- ----------
Employee Impacted Period cost Q1-2020 Q1       2020         10
Employee Impacted Period cost Q2-2020 Q2       2020         20
Employee Impacted Period cost Q3-2020 Q3       2020          0
Employee Impacted Period cost Q4-2020 Q4       2020       4000

SQL>