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  ('语文','数学','英语')  ->先提前取出所有学科,然后动态拼接

 );

你可能感兴趣的:(oracle行列转换)