【问题标题】:How to return a redundant row for duplicate ID in single row in Oracle如何在 Oracle 的单行中返回重复 ID 的冗余行
【发布时间】:2019-10-19 18:05:47
【问题描述】:

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

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 值的合并来自我加入并仅检索一条记录

预期结果是这样的,

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

【问题讨论】:

    标签: sql oracle oracle11g pivot listagg


    【解决方案1】:

    你可以使用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'));
    
    

    db小提琴here

    【讨论】:

    • 说 Col 是无效标识符,我可以理解它不是从任何地方派生的,但如何实时进行映射是我的问题
    【解决方案2】:

    使用条件聚合似乎很简单:

    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;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • 如何实时映射列名,(col = 'Name' - 在这一行中的情况)。抱歉这个愚蠢的问题,但我是新手
    • @RajeshB 。 . .这需要动态 SQL,而不是您在此处提出的问题。如果您有 问题,请将其作为 问题提出,但在此之前您可能需要调查“动态枢轴”。
    • 是的,通过检查已更改的列,我得到了它。谢谢。
    猜你喜欢
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多