Oracle PL / SQL将重复的行移动到1行

时间:2019-03-20 08:52:20

标签: sql oracle plsql

我在表中有以下几行。在这种情况下,atr列可以用于任何其他用途,因此我想将这3行移动到一行,将每个唯一的sup_name移到任何一个atr列。

我想将列sup_name条目移至其各自的单独列,以避免冗余。

Program.Main

我希望它最终如下所示

CREATE TABLE dups
( dups_id number(10) NOT NULL,
  dups_name varchar2(50) NOT NULL,
sup_name varchar2(50)
  atr1 varchar2(50)
 atr2 varchar2(50)
 atr3 varchar2(50)
 atr4 varchar2(50)
);

    insert into dups(dups_id,dups_name,sup_name,atr1,atr2,atr3)
 values(1,'Resego Kebopetswe', 'resego231dty',null,null,null)
    insert into dups(dups_id,dups_name,sup_name,atr1,atr2,atr3)
 values(2,'Resego Kebopetswe', 'resego532dty',null,null,null)
    insert into dups(dups_id,dups_name,sup_name,atr1,atr2,atr3)
 values(3,'Resego Kebopetswe', 'resego420qas',null,null,null)

dups_id   dups_name          sup_name      atr1   atr2   atr3    
1         Resego Kebopetswe  resego231dty  null   null   null    
2         Resego Kebopetswe  resego532dty  null   null   null    
3         Resego Kebopetswe  resego420qas  null   null   null    

1 个答案:

答案 0 :(得分:0)

此数据透视查询在atr1 ... atr4列中显示重复名称的sup_names。

select sup_name_id dups_id, dups_name, sup_name, atr1, atr2, atr3, atr4
  from (select dups_id, dups_name, sup_name, 
               row_number() over (partition by dups_name order by dups_id) rn 
          from dups d)
  pivot(min(dups_id) id, max(sup_name) for rn in (1 sup_name, 2 atr1, 3 atr2, 4 atr3, 5 atr4))

dbfiddle demo

DUPS_ID DUPS_NAME           SUP_NAME      ATR1          ATR2          ATR3     ATR4
------- ------------------  ------------  ------------  ------------  -------  --------
      1 Resego Kebopetswe   resego231dty  resego532dty  resego420qas

如果要更新表中的值,请使用merge中的此查询作为源数据。