原效果
stuCode | stuName | stuSub | point |
---|---|---|---|
01 | ZS | 数学 | 90 |
01 | ZS | 物理 | 91 |
01 | ZS | 化学 | 91 |
实现效果
stuCode | stuName | math | physical | Chemistry |
---|---|---|---|---|
01 | ZS | 90 | 91 | 91 |
1. 使用 pivot for 聚合函数
-- Oracle pivot([聚合函数]) for [需行转列的字段名] in('[需行转列的字段值类型1]' AS [目标列名1], '[需行转列的字段值类型2]' AS [目标列名2]) 动态行转列
-- eg
SELECT * FROM (SELECT stuCode, stuName, stuSub, point FROM STU_CLASS_GRA)
pivot(sum(point)) for stuSub in ('数学' AS math, '物理' AS physical, '化学' AS Chemistry)
-- 勘误,当时手写的例子,不够仔细...
pivot(sum(point) for stuSub in ('数学' AS math, '物理' AS physical, '化学' AS Chemistry))
2. 使用 listagg within 聚合函数
SELECT listagg(neqnum, ',') within group(order by neqnum) tables FROM PLO_CONCIST
结束~~
写在后面:
实现行专列的方式有很多种,除了以上两种方式,还可以根据 join 方式进行手动拼接,还可以创建自定义函数等…值得一提的是 wmconcat 方法也可以实现行专列,不过在 Oracle12 版本之后已经不支持了。