oracle行列转换方法

数据库中有以下数据

姓名 学科 成绩
张三 语文 90
张三 数学 80
李四 语文 70
李四 数学 85

需要转换成下面显示格式

姓名 语文 数学
张三 90 80
李四 70 85

通常做法是,使用CASE WHEN把学科分开后,再合计起来

SELECT 姓名,

             SUM(

                     CASE WHEN 学科=‘语文’ THEN 成绩

                                ELSE 0

                      END

                    ) AS 语文,

             SUM(

                     CASE WHEN 学科=‘数学’ THEN 成绩

                                ELSE 0

                      END

                    ) AS 数学

FROM 表

GROUP BY 姓名

但是,学科不是固定的情况,以上的方法就无法解决。

姓名 学科 成绩
张三 语文 90
张三 数学 80
李四 语文 70
李四 数学 80
李四 英语 90

oracle11g以前只能写PL/SQL来解决,11g后可以使用PIVOT函数来解决。

WITH pivot_data AS (

         SELECT 学科, 姓名, 成绩

         FROM   表

 )

SELECT *

FROM   pivot_data

PIVOT (

            SUM(成绩) 

            FOR 学科

            IN  ('语文','数学','英语')  ->先提前取出所有学科,然后动态拼接

 );

猜你喜欢

转载自billmingchen.iteye.com/blog/1925117
今日推荐