oracle – 将行转换为多列
发布时间:2020-12-12 13:10:13 所属栏目:百科 来源:网络整理
导读:我有一个SQL Server实例,它具有到Oracle服务器的链接服务器. Oracle服务器上有一个名为PersonOptions的表,其中包含以下数据: ╔══════════╦══════════╗║ PersonID ║ OptionID ║╠══════════╬══════════╣║
我有一个SQL Server实例,它具有到Oracle服务器的链接服务器. Oracle服务器上有一个名为PersonOptions的表,其中包含以下数据:
╔══════════╦══════════╗ ║ PersonID ║ OptionID ║ ╠══════════╬══════════╣ ║ 1 ║ A ║ ║ 1 ║ B ║ ║ 2 ║ C ║ ║ 3 ║ B ║ ║ 4 ║ A ║ ║ 4 ║ C ║ ╚══════════╩══════════╝ 我需要转动这些数据,结果如下: ╔══════════╦═════════╦══════════╦══════════╗ ║ PersonID ║ OptionA ║ Option B ║ Option C ║ ╠══════════╬═════════╬══════════╬══════════╣ ║ 1 ║ 1 ║ 1 ║ ║ ║ 2 ║ ║ ║ 1 ║ ║ 3 ║ ║ 1 ║ ║ ║ 4 ║ 1 ║ ║ 1 ║ ╚══════════╩═════════╩══════════╩══════════╝ 有什么建议? 您可以通过几种方法执行此数据转换.您可以访问PIVOT函数,这将是最简单的,但如果没有,那么您可以使用聚合函数和CASE.聚合/案例版本: select personid,max(case when optionid = 'A' then 1 else 0 end) OptionA,max(case when optionid = 'B' then 1 else 0 end) OptionB,max(case when optionid = 'C' then 1 else 0 end) OptionC from PersonOptions group by personid order by personid; 见SQL Fiddle with Demo 静态枢轴: select * from ( select personid,optionid from PersonOptions ) src pivot ( count(optionid) for optionid in ('A' as OptionA,'B' OptionB,'C' OptionC) ) piv order by personid 见SQL Fiddle with Demo 动态版本: 如果你有一个已知数量的值,上面的两个版本工作得很好,但如果你的值是未知的,那么你将需要实现动态sql,在Oracle中你可以使用一个过程: CREATE OR REPLACE procedure dynamic_pivot_po(p_cursor in out sys_refcursor) as sql_query varchar2(1000) := 'select personid '; begin for x in (select distinct OptionID from PersonOptions order by 1) loop sql_query := sql_query || ',min(case when OptionID = '''||x.OptionID||''' then 1 else null end) as Option_'||x.OptionID; dbms_output.put_line(sql_query); end loop; sql_query := sql_query || ' from PersonOptions group by personid order by personid'; dbms_output.put_line(sql_query); open p_cursor for sql_query; end; / 然后返回结果,您将使用: variable x refcursor exec dynamic_pivot_po(:x) print x 结果与所有版本相同: | PERSONID | OPTIONA | OPTIONB | OPTIONC | ------------------------------------------ | 1 | 1 | 1 | 0 | | 2 | 0 | 0 | 1 | | 3 | 0 | 1 | 0 | | 4 | 1 | 0 | 1 | (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – 使用Entity Framework进行自引用
- 解决IE中无法解析xml
- vue学习笔记之指令v-text && v-html &&
- AxonFramework命令模型
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper](六)
- 哪个monad在Haskell中用于聚合执行一系列语句时可能发生的异
- iphone – 如何从UIView / UIScrollView创建图像
- ruby-on-rails – Ruby on Rails用户管理引擎/框架? (带网
- 为什么PostgreSQL json_agg()函数不返回空数组?
- 使用Ajax进行用户名动态校验,局部属性页面