如何在Oracle PLSQL中透视表?

时间:2019-12-09 08:53:35

标签: sql oracle pivot

我有一个如下表:

KEY 1995    1996    1997    1998    1999    2000    2001    2002    2003
123 0       0       0       461     1188    2049    1056    377     295

我希望数据显示如下。

KEY SEQ_NBR SEQ_YR  VALUE_SUM
123 1       1995    0
123 2       1996    0
123 3       1997    0
123 4       1998    461
123 5       1999    1188
123 6       2000    2049
123 7       2001    1056
123 8       2002    377
123 9       2003    295

我正在使用Oracle 12c。我尝试使用Pivot子句,但无法创建查询。

有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

您可以使用union取消透视。这是一种适用于大多数RDBMS的标准技术(不同于特定于供应商的枢轴/枢轴方法)。

select key, 1 seq_nbr, '1995' seq_yr, "1995" value_sum
union all select key, 2 seq_nbr, '1996' seq_yr, "1996" value_sum
union all select key, 3 seq_nbr, '1997' seq_yr, "1997" value_sum
union all select key, 4 seq_nbr, '1998' seq_yr, "1998" value_sum
union all select key, 5 seq_nbr, '1999' seq_yr, "1999" value_sum
union all select key, 6 seq_nbr, '2000' seq_yr, "2000" value_sum
union all select key, 7 seq_nbr, '2001' seq_yr, "2001" value_sum
union all select key, 8 seq_nbr, '2002' seq_yr, "2002" value_sum
union all select key, 9 seq_nbr, '2003' seq_yr, "2003" value_sum

答案 1 :(得分:2)

有趣的是:我正在用PL / SQL循环和动态SQL填充旧表中的新表。这是我们通常不会做的事情,但是为什么不为一次性任务呢?

begin
  for col in
  (
    select column_name
    from user_tab_cols
    where table_name = 'OLDTABLE' and regexp_like(column_name, '^[[:digit:]]{4}$')
  ) loop
    execute immediate
      'insert into newtable (key, year, value)
       select key, ' || col.column_name || ', "' || col.column_name || '" from oldtable';
  end loop;
  commit;
end;