-
oracle SQL竖表转横表(行转列)
T_T_STUDENT表查询记录如下,要转成横表姓名 课程 成绩1 张飞 语文 802 张飞 数学 873 关羽 语文 974 张飞 英语 685 关羽 数学 536 刘备 语文 90create table T_T_STUDENT ( name VARCHAR2(20), course VARCHAR2(20), score NUMBER(10) )
输出结果如下:姓名 语文 数学 英语1 刘备 90 94 922 关羽 97 53 953 张飞 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 英语))
列变行:正在研究,没弄出来呢
oracle SQL 行、列转换
最新推荐文章于 2024-07-31 14:31:55 发布