gpt4 book ai didi

sql - 数据库表行列转换

转载 作者:行者123 更新时间:2023-12-04 05:25:06 24 4
gpt4 key购买 nike

我有数据库表。当我进一步看到数据采用特定格式时。如何在不直接使用查询创建临时表的情况下执行以下转换? col2 不是静态字段 X 和 Y 它是动态确定的,即没有列是动态的。
enter image description here

最佳答案

您没有指定您使用的是哪个版本的 Oracle,因此这里有一些解决方案。

如果您使用的是 Oracle 11g+,那么您可以访问 PIVOT功能:

select *
from
(
select col1, col2, col3
from yourtable
) src
pivot
(
max(col3)
for col2 in ('X', 'Y')
) piv

SQL Fiddle with Demo

如果您使用的是另一个版本的 Oracle,那么您可以使用带有 CASE 的聚合函数。声明:
select col1,
min(case when col2 = 'X' then col3 end) X,
min(case when col2 = 'Y' then col3 end) Y
from yourtable
group by col1

SQL Fiddle with Demo

如果您有未知号码 col2 values,那么就可以在oracle中创建一个procedure来生成动态sql:
CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
sql_query varchar2(1000) := 'select col1 ';

begin
for x in (select distinct col2 from yourtable order by 1)
loop
sql_query := sql_query ||
' , min(case when col2 = '''||x.col2||''' then col3 end) as '||x.col2;

dbms_output.put_line(sql_query);
end loop;

sql_query := sql_query || ' from yourtable group by col1';

open p_cursor for sql_query;
end;
/

然后执行它:
variable x refcursor
exec dynamic_pivot(:x)
print x

结果应该是一样的:
| COL1 |  X  |  Y |
--------------------
| A | 1 | 3 |
| B | 2 | 4 |

关于sql - 数据库表行列转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com