sql - 如何在 Oracle PLSQL 中透视表?

标签 sql database oracle pivot unpivot

我有一个表格如下:

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 子句,但无法创建查询。

有人可以帮我吗?

最佳答案

为了好玩:我使用 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;

关于sql - 如何在 Oracle PLSQL 中透视表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59245367/

相关文章:

c - 如何让 Pro*C 处理#warning 指令?

mysql - 如何将列的类型从 varchar(30) 更改为 varchar(100)?

sql - 如何使用java检索sql表及其所有数据

sql - 我怎样才能通过对大表的查询来加快这个计数+分组的速度?

mysql - 数据库查询月份

mysql - 如何一条一条的选择记录而不重复

php - 如何扩展 Adminer 以支持带登录的 SQLite 数据库?

SQL 自动从上一个日期为表中缺失的日期生成缺失的日期和价格

sql - 如何在oracle中替换列中的部分字符串

iPhone:将 Oracle 时间戳转换为 NSDate 或 Unix 时间戳(例如 double )