为了账号安全,请及时绑定邮箱和手机立即绑定

在Oracle中将行动态转换为列

在Oracle中将行动态转换为列

绝地无双 2019-12-03 10:45:55
我有以下名为_kv的Oracle 10g表:select * from _kvID       K       V----     -----   -----  1      name    Bob  1      age     30  1      gender  male  2      name    Susan  2      status  married我想使用普通SQL(而不是PL / SQL)将键转换为列,以便生成的表如下所示:ID       NAME    AGE    GENDER  STATUS----     -----   -----  ------  --------  1      Bob      30     male   2      Susan                   married该查询应具有与表中K存在的unique一样多的列(数量不多)在运行查询之前,无法知道可能存在哪些列。我试图避免运行初始查询以编程方式构建最终查询。空白单元格可以为null或空字符串,并不重要。我正在使用Oracle 10g,但是11g解决方案也可以。当您知道您的透视列可能被称为什么时,这里有很多示例,但是我只是找不到适用于Oracle的通用透视解决方案。谢谢!
查看完整描述

3 回答

?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

为了处理可能存在多个值(在您的示例中为v)的情况,我使用PIVOT和LISTAGG:


SELECT * FROM

(

  SELECT id, k, v

  FROM _kv 

)

PIVOT 

(

  LISTAGG(v ,',') 

  WITHIN GROUP (ORDER BY k) 

  FOR k IN ('name', 'age','gender','status')

)

ORDER BY id;

由于需要动态值,因此在调用透视表语句之前,请使用动态SQL并传递通过在表数据上运行select所确定的值。


查看完整回答
反对 回复 2019-12-03
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

碰巧要完成一项任务。下面对我来说适用于11g的测试:


select * from

(

  select ID, COUNTRY_NAME, TOTAL_COUNT from ONE_TABLE 

pivot(

  SUM(TOTAL_COUNT) for COUNTRY_NAME in (

    'Canada', 'USA', 'Mexico'

  )

);


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 1130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信