Как вернуть избыточную строку для повторяющегося идентификатора в одной строке в Oracle - PullRequest
0 голосов
/ 04 июня 2019

У меня есть таблица вида аудита, где мы храним некоторую информацию, основанную на некоторых триггерах, в других таблицах.

ID, Changed_Column, OldValue, NewValue будут доступны.Теперь есть возможность для того же Id, что будет 3-4 дубликата, так как измененный столбец будет иметь разные значения. Я хочу объединить их в одну строку и взять данные. Например,

ID   ChangedColumn OldValue NewValue
1    Name           Bob     Roy
1    Age            26      28  
1    Section        B       C

Когда мы выбираем сейчасон отобразит все строки в отдельности, но я хочу самостоятельно объединить и извлечь только одну запись путем слияния на основе значения идентификатора

Ожидаемый результат равен,

ID   Name               Age           Section     ChangedColumns
1    was :Bob now : Roy was:26 now:28 Was:B now:C Name, Age, Section

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Это довольно просто сделать с помощью условного агрегирования:

select id,
       max(case when col = 'Name' then str end) as name,
       max(case when col = 'Age' then str end) as age,
       max(case when col = 'Section' then str end) as section
from (select t.*, ('was: ' || OldValue || ' now: ' || NewValue) as str
      from t
     ) t
group by id;

Здесь - это дБ <> скрипка.

1 голос
/ 04 июня 2019

Для группировки имен столбцов вы можете использовать функцию listagg. для преобразования строк в столбцы используйте функцию Pivot.

with tab as(
  select 1 as id,    'Name' as col,    'Bob' as OldValue ,     'Roy' as NewValue from dual union all
  select 1 as id,    'Age',            '26',      '28' as NewValue from dual union all  
  select 1 as id,    'Section',        'B',       'C' as NewValue from dual 
)
select * 

from (
select id
      ,t.col as col
      ,max('was: '|| t.OldValue || ' now: ' || t.NewValue) as val
      ,listagg(t.col,',') within group(order by t.id) OVER (PARTITION BY null)  as ChangedColumn 
from tab t
group by id,t.col

) 
pivot ( max(val)  for col in('Name','Age','Section'));

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...