总牛人已经总结过了:
http://www.itpub.net/forum.php?mod=viewthread&tid=1017026&extra=&highlight=%D0%D0%C1%D0&page=1
今天自己动手简单操作一下,只学习原理和最简单的方法,不做深入研究,改天工作用到再深入。
一.行转列:把多行里的数据转换到列里去(多个短行转为一个长行)。(这个用的较多吧)
1.根据某列来分组
2.把某列的列值作为结果中的列名
3.根据2中的列名查出需要的结果
SQL> WITH t AS (
2 SELECT '张三' NAME,'语文' SUBJECT, '80' SCROE FROM dual UNION ALL
3 SELECT '张三' NAME,'英语' , '85' FROM dual UNION ALL
4 SELECT '张三' NAME,'英语' , '99' FROM dual UNION ALL
5 SELECT '张三' NAME,'数学' , '93' FROM dual UNION ALL
6 SELECT '李四' NAME,'语文' , '90' FROM dual UNION ALL
7 SELECT '李四' NAME,'英语' , '75' FROM dual UNION ALL
8 SELECT '李四' NAME,'数学' , '87' FROM dual )
9 SELECT * FROM t;
NAME SUBJECT SCROE
---- ------- -----
张三 语文 80
张三 英语 85
张三 英语 99
张三 数学 93
李四 语文 90
李四 英语 75
李四 数学 87
现在要得出张三、李四各科的最高成绩:
NAME 语法 英语 数学
---- ---- ---- ----
李四 90 75 87
张三 80 99 93
根据名字分组,把subject列的值转换为列名,求分数。
9 SELECT NAME,
10 MAX(DECODE(SUBJECT, '语文', SCROE)) 语法,
11 MAX(DECODE(SUBJECT, '英语', SCROE)) 英语,
12 MAX(DECODE(SUBJECT, '数学', SCROE)) 数学
13 FROM T
14 GROUP BY NAME;
NAME 语法 英语 数学
---- ---- ---- ----
李四 90 75 87
张三 80 99 93
现在想知道哪个科目报了多少人怎么办?即
9 SELECT subject ,wmsys.wm_concat(DISTINCT NAME) 报名学生 FROM t GROUP BY subject;
SUBJECT 报名学生
------- --------------------------------------------------------------------------------
数学 李四,张三
英语 李四,张三
语文 李四,张三
二。列转行:把一行的数据根据列名转换为多行数据(一个长行转为多个短行)。(这个较少吧)
1.根据某一列分组
2.把其余每列的值都放到别一个字段中去,结果一共有 (N-1)原表行数。
SQL> WITH t AS(
2 SELECT '李四' NAME, '90' 语文,'75' 英语,'87' 数学 FROM DUAL UNION ALL
3 SELECT '张三' NAME, '80' 语文,'99' 英语,'93' 数学 FROM DUAL )
4 SELECT * FROM t;
NAME 语文 英语 数学
---- ---- ---- ----
李四 90 75 87
张三 80 99 93
4 SELECT NAME, '语文' SUBJECT, 语文 FROM T UNION ALL
5 SELECT NAME, '英语' SUBJECT, 英语 FROM T UNION ALL
6 SELECT NAME, '数学' SUBJECT, 数学 FROM T
7 ORDER BY NAME
8 ;
NAME SUBJECT 语文
---- ------- ----
李四 语文 90
李四 英语 75
李四 数学 87
张三 英语 99
张三 数学 93
张三 语文 80
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24478467/viewspace-711036/,如需转载,请注明出处,否则将追究法律责任。