简单的行转列,成绩统计方式,oracle和mysql通用方式

  在看行转列的时候,看到网上很多资料都写的太复杂,我记录一个比较简单的方式,作为自己行转列的初步学习可以看看,解决比较复杂的业务问题可能帮不上忙,勿喷。

  主要实现思路就是,先将行转成列,但是这个时候,会出现:

执行语句:

SELECT NAME
    姓名,
CASE
SUBJECT 
    WHEN '语文' THEN
    score 
    END 语文,
CASE
SUBJECT 
    WHEN '数学' THEN
    score 
    END 数学,
CASE
SUBJECT 
    WHEN '英语' THEN
    score 
    END 英语 
FROM
    student

效果图:

简单的行转列,成绩统计方式,oracle和mysql通用方式

这种结果,然后就需要使用聚合函数来将数据合并到一列,因为这里是分数,使用sum求和函数,如果是字符串的话可以用concat来聚合。

下面是实现过程:

数据示例:

简单的行转列,成绩统计方式,oracle和mysql通用方式

转换效果:

简单的行转列,成绩统计方式,oracle和mysql通用方式

1、oracle-decode方式:

SELECT 
    NAME 姓名,
    sum( decode( SUBJECT, '语文', score, 0 ) ) 语文,
    sum( decode( SUBJECT, '数学', score, 0 ) ) 数学,
    sum( decode( SUBJECT, '英语', score, 0 ) ) 英语 
FROM
    student 
GROUP BY
NAME

2、mysql,oracle 通用方式,使用case when的方式:

SELECT 
    NAME 姓名,
    sum( CASE SUBJECT WHEN '语文' THEN score END ) 语文,
    sum( CASE SUBJECT WHEN '数学' THEN score END ) 数学,
    sum( CASE SUBJECT WHEN '英语' THEN score END ) 英语 
FROM
    student 
GROUP BY
NAME