在Oracle中将行动态转换为列

我有以下名为_kv的Oracle 10g表:


select * from _kv


ID       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的通用透视解决方案。


谢谢!


绝地无双
浏览 1146回答 3
3回答

料青山看我应如是

为了处理可能存在多个值(在您的示例中为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所确定的值。

拉风的咖菲猫

碰巧要完成一项任务。下面对我来说适用于11g的测试:select * from(  select ID, COUNTRY_NAME, TOTAL_COUNT from ONE_TABLE ) pivot(  SUM(TOTAL_COUNT) for COUNTRY_NAME in (    'Canada', 'USA', 'Mexico'  ));
打开App,查看更多内容
随时随地看视频慕课网APP