如何在 Oracle PLSQL 中转换 table?
How to pivot a table in Oracle PLSQL?
我有一个 table 如下:
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 子句,但无法创建查询。
有人可以帮我吗?
您可以使用 union
来 unpivot。这是适用于大多数 RDBMS 的标准技术(不同于特定于供应商的 pivot/unpivot 方法)。
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
为了好玩:我正在用 PL/SQL 循环和动态 SQL 从旧的 table 填充新的 table。这不是我们经常做的事,但为什么不一次性完成呢?
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;
我有一个 table 如下:
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 子句,但无法创建查询。
有人可以帮我吗?
您可以使用 union
来 unpivot。这是适用于大多数 RDBMS 的标准技术(不同于特定于供应商的 pivot/unpivot 方法)。
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
为了好玩:我正在用 PL/SQL 循环和动态 SQL 从旧的 table 填充新的 table。这不是我们经常做的事,但为什么不一次性完成呢?
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;