近期在工作中。对行转列进行了应用,在此做一个简单的小结。


      转换步骤例如以下:

        1、创建表结构
CREATE TABLE RowToCol 
(
ID NUMBER(10) not null,
USER_NAME VARCHAR2(20 CHAR),
COURSE VARCHAR2(20 CHAR),
SCORE VARCHAR2(20 CHAR)
)


        2、插入測试数据(原始数据如图)




        Oracle 行转列小结_行转列



        3、行转列实现效果




        Oracle 行转列小结_字符串_02


        4、详细实现

        主要原理是利用decode函数、聚集函数(sum/max/min/avg),结合group by分组实现的,详细sql例如以下:


select t.user_name as 姓名,
MAX(decode(t.course,'语文',score,null)) as 语文,
MAX(decode(t.course,'数学',score,null)) as 数学。
MAX(decode(t.course,'英语',score,null)) as 英语
from RowToCol t group by t.user_name order by t.user_name



      

      *当要分组的值,如样例中的score列是数值型,则聚集函数能够使用sum/max/min/avg,可是字符行的仅仅能使用max/min。




------------------------------------------------------------------------------------------------------------------------------------------------------


      附注:

      decode函数:

      它是一种特有的函数计算方式,相当于计算机语言中的if...else...

       decode(条件。值1。翻译值1,值2。翻译值2,...值n。翻译值n,缺省值)

      其理解为:

       

if (条件==值1)
then    
return(翻译值1)
elsif (条件==值2)
then    
return(翻译值2)    
......
elsif (条件==值n)
then    
return(翻译值n)
else    
return(缺省值)
end if



      行转列包含行转列、列转行、多列转换成字符串、多行转换成字符串、字符串转换成多行和字符串转换成多列六种情况。假设大家有兴趣,能够进行进一步的研究。