oracle SQL竖表转横表(行转列)

T_T_STUDENT表查询记录如下,要转成横表

姓名     课程     成绩

1     张飞     语文     80

2     张飞     数学     87

3     关羽     语文     97

4     张飞     英语     68

5     关羽     数学     53

6     刘备     语文     90

create table T_T_STUDENT

(

name VARCHAR2(20),

course VARCHAR2(20),

score NUMBER(10)

)

方法一:

--用decode实现,

SELECT T.NAME,

SUM(DECODE(T.Course, '语文', T.Score)) 语文,

SUM(DECODE(T.Course, '数学', T.Score)) 数学,

SUM(DECODE(T.Course, '英语', T.Score)) 英语

FROM T_T_STUDENT T

GROUP BY T.NAME

方法二:

--用case when 实现

SELECT T.NAME,

SUM(CASE T.Course WHEN '语文' THEN T.Score ELSE 0 END) 语文,

SUM(CASE T.Course WHEN '数学' THEN T.Score ELSE 0 END) 数学,

SUM(CASE T.Course WHEN '英语' THEN T.Score ELSE 0 END) 英语

FROM T_T_STUDENT T

GROUP BY T.NAME

输出结果如下:

姓名     语文  数学  英语

1     刘备     90     94     92

2     关羽     97     53     95

3     张飞     80     87     68

区别如果条件是单一值时,用decode比较简便,如果判断条件比较复杂是用case when实现

oracle SQL横表转竖表(列转行)

这儿要用到另一的技巧就是笛卡尔乘积,将一行复制成三行,每一行取一个类型的电话

偷个懒儿把上边的结果表叫r表,把列还原成行的SQL:

#1.空的还为空

with r as(

SELECT T.NAME,

SUM(DECODE(T.Course, '语文', T.Score)) 语文,

SUM(DECODE(T.Course, '数学', T.Score)) 数学,

SUM(DECODE(T.Course, '英语', T.Score)) 英语

FROM T_T_STUDENT T

GROUP BY T.NAME

)

select r.name,

decode(lvl,1,'语文',2,'数学',3,'英语') corse,

decode(lvl,1,r.语文,2,数学,3,英语) score

from r,

(select level lvl from dual connect by level<=3)

#2.空的填0

with r as (

SELECT T.NAME,

SUM(CASE T.Course WHEN '语文' THEN T.Score ELSE 0 END) 语文,

SUM(CASE T.Course WHEN '数学' THEN T.Score ELSE 0 END) 数学,

SUM(CASE T.Course WHEN '英语' THEN T.Score ELSE 0 END) 英语

FROM T_T_STUDENT T

GROUP BY T.NAME)

select r.name,

decode(lvl,1,'语文',2,'数学',3,'英语') corse,

decode(lvl,1,r.语文,2,数学,3,英语) score

from r,

(select level lvl from dual connect by level<=3)

2. 11g 自带的行列转换

11g在SELECT语句中新加了关键词PIVOT和UNPIVOT,用这两个关键词,重写上面的两个查询,就变成这个样子的了:

行变列:

select * from t_t_student

pivot

(max(score) for course in('语文' as 语文,'数学' as 数学,'英语' as 英语))

列变行:

正在研究,没弄出来呢

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐