首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Oracle的单行中返回重复ID的冗余行

如何在Oracle的单行中返回重复ID的冗余行
EN

Stack Overflow用户
提问于 2019-06-04 08:21:14
回答 2查看 168关注 0票数 0

我有一个审计类的表,我们根据其他表中的一些触发器存储一些信息。

ID,Changed_Column,OldValue,NewValue将可用。现在有可能使用相同的Id,会有3-4个重复,因为更改后的列将有不同的值,我希望将它们合并为单行,并为exmaple获取数据,

代码语言:javascript
复制
ID   ChangedColumn OldValue NewValue
1    Name           Bob     Roy
1    Age            26      28  
1    Section        B       C

当我们选择现在,它将显示所有行为分隔,但我想要自我连接和检索只有一个记录通过合并基于ID值

预期的结果是,

代码语言:javascript
复制
ID   Name               Age           Section     ChangedColumns
1    was :Bob now : Roy was:26 now:28 Was:B now:C Name, Age, Section
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-04 09:15:59

要对列名进行分组,可以使用listagg函数。若要将行转换为列,请使用Pivot函数。

代码语言:javascript
复制
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'));

db<>fiddle https://dbfiddle.uk/?rdbms=oracle_18&fiddle=de694207bf1221e95372b7953bffe1a3

票数 1
EN

Stack Overflow用户

发布于 2019-06-04 11:20:35

使用条件聚合似乎非常简单:

代码语言:javascript
复制
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;

这里是db<>fiddle。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56439988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档