我有以下名为_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条经验 获得超8个赞
为了处理可能存在多个值(在您的示例中为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所确定的值。
拉风的咖菲猫
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'
)
);
添加回答
举报
0/150
提交
取消