oracle SQL 行、列转换

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语句中新加了关键词 PIVOTUNPIVOT,用这两个关键词,重写上面的两个查询,就变成这个样子的了:
行变列:
select * from t_t_student
pivot
(max(score) for course in('语文' as 语文,'数学' as 数学,'英语' as 英语))
 
列变行:
正在研究,没弄出来呢
 

猜你喜欢

转载自junqiang.iteye.com/blog/2271825