Поворот нескольких атрибутов и группировка их как «единый» атрибут (многие к одному) - PullRequest
0 голосов
/ 30 апреля 2019

Итак, у меня есть таблица с именем Value, которая связана с разными «полями».Обратите внимание, что некоторые из этих полей имеют похожие «имена», но они называются по-разному.В конечном итоге я хочу, чтобы эти 'похожие имена' были объединены в одно и то же имя поля в наборе результатов

  VALUE_ID      VALUE_TX       FIELD_NAME     Version_ID
      1          Yes             Adult           1
      2          18              Age             1
      3          Black           Eye Color       1 
      4          Yes             Is_Adult        2
      5          25              Years_old       2
      6          Brown           Color_of_Eyes   2

У меня есть таблица с именем Submitted, которая выглядит следующим образом:

  Version_ID   Version_Name
     1         TEST_RUN
     2         REAL_RUN

Мне нужен набор результатов, который выглядит следующим образом:

  Submitted_Name    Adult?     Age     Eye_Color
     TEST_RUN       Yes        18      Black
     REAL_RUN       Yes        25      Brown

Я пробовал следующее:

  SELECT * FROM (
                  select value_Tx, field_name, version_id
                    from VALUE
                )
          PIVOT (max (value_tx) for field_name in (('Adult', 'Is_Adult')   as 'Adult?', ('Age', 'Years_old') as 'Age', ('Eye Color', 'Color_of_Eyes') as 'Eye_Color')
           );

Что я делаю не так?Пожалуйста, дайте мне знать, если мне нужно добавить какие-либо дополнительные данные / данные.

Заранее спасибо!

Полученное сообщение об ошибке следующее:

ORA-00907: missing right parenthesis

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Вы можете использовать двойные кавычки для псевдонимов столбцов в части предложения pivot, и я думаю, что функция decode хорошо подходит для этого вопроса. Вы можете рассмотреть возможность использования следующего запроса:

with value( value_id, value_tx, field_name, version_id ) as
(
 select 1 ,'Yes'  ,'Adult'        ,1 from dual union all
 select 2 ,'18'   ,'Age'          ,1 from dual union all
 select 3 ,'Black','Eye_Color'    ,1 from dual union all
 select 4 ,'Yes'  ,'Is_Adult'     ,2 from dual union all
 select 5 ,'25'   ,'Years_old'    ,2 from dual union all
 select 6 ,'Brown','Color_of_Eyes',2 from dual    
), Submitted( version_id, version_name ) as
(
 select 1 ,'TEST_RUN' from dual union all
 select 2 ,'REAL_RUN' from dual    
)    
  select * from
  (
    select s.version_name as "Submitted_Name", v.value_Tx, 
           decode(v.field_name,'Adult','Is_Adult','Age','Years_old','Eye_Color',
                               'Color_of_Eyes',v.field_name) field_name
      from value v
      join Submitted s 
        on s.version_id = v.version_id
     group by decode(v.field_name,'Adult','Is_Adult','Age','Years_old','Eye_Color',
                                  'Color_of_Eyes',v.field_name),
              v.value_Tx, s.Version_Name
  ) 
  pivot(
         max(value_tx) for field_name in ( 'Is_Adult' as "Adult?", 'Years_old' as "Age", 
                                           'Color_of_Eyes' as "Eye_Color" )
       );

Submitted_Name  Adult?  Age Eye_Color
REAL_RUN        Yes     25  Brown
TEST_RUN        Yes     18  Black

Я думаю, лучше решить как можно более коротким путем, например, использование модульной арифметики было бы даже лучше, как показано ниже:

select *
  from
  (
    select s.version_name as "Submitted_Name", v.value_Tx, mod(v.value_id,3) as value_id
      from value v
      join Submitted s 
        on s.version_id = v.version_id
     group by v.value_Tx, s.version_name, mod(v.value_id,3)
  ) 
  pivot(
         max(value_tx) for value_id in ( 1 as "Adult?", 2 as "Age", 0 as "Eye_Color" )
       ) 

Демо

1 голос
/ 30 апреля 2019

Я бы изменил имена полей в подзапросе:

SELECT *
FROM (select value_Tx,
             (case when field_name in ('Adult', 'Is_Adult') then 'Adult?'
                        field_name in ('Age', 'Years_old') then 'Age'
                        field_name in ('Eye Color', 'Color_of_Eyes') then 'Eye_Color'                        
                   else field_name
              end) as field_name, version_id
      from VALUE
     )
PIVOT (max(value_tx) for field_name in ('Adult?', 'Age', 'Eye_Color'));
...