|
一、行轉(zhuǎn)列 在有些應(yīng)用場景中,如學(xué)生成績。學(xué)生所有科目的成績都保存到一張表里面,當(dāng)我們需要以列表的形式顯示出學(xué)生所對應(yīng)的每一科目的成績的時候,需要使用到行轉(zhuǎn)列。 示例 1 -- 學(xué)生成績表 2 create table grade ( 3 id varchar2(64) not null, 4 name varchar2(20) not null, 5 course varchar2(100) not null, 6 score number(3) not null, 7 primary key (id) 8 ) 9 10 -- 初始化數(shù)據(jù)11 insert into grade values( '100001', '張三', '語文', 75);12 insert into grade values( '100002', '張三', '數(shù)學(xué)', 80);13 insert into grade values( '100003', '張三', '英語', 80);14 15 insert into grade values( '100004', '李四', '語文', 86);16 insert into grade values( '100005', '李四', '數(shù)學(xué)', 66);17 insert into grade values( '100006', '李四', '英語', 81);18 19 insert into grade values( '100007', '王五', '語文', 92);20 insert into grade values( '100008', '王五', '數(shù)學(xué)', 78);21 insert into grade values( '100009', '王五', '英語', 82);22 23 insert into grade values( '100010', '趙六', '語文', 80);24 insert into grade values( '100011', '趙六', '數(shù)學(xué)', 90);25 insert into grade values( '100012', '趙六', '英語', 77);26 27 insert into grade values( '100013', '李明', '語文', 69);28 insert into grade values( '100014', '李明', '數(shù)學(xué)', 75);29 insert into grade values( '100015', '李明', '英語', 80); 行轉(zhuǎn)列語句 1 select2 t.name '姓名',3 sum(decode(t.course, '語文', t.score , 0)) '語文',4 sum(decode(t.course, '數(shù)學(xué)', t.score , 0)) '數(shù)學(xué)', 5 sum(decode(t.course, '英語', t.score , 0)) '英語' 6 from grade t 7 group by t.name 因為這里使用到了 group by t.name,所以對于要展示score只能使用聚合函數(shù)(sum,max,min)都可以,如果不使用聚合函數(shù)就會報錯。 執(zhí)行結(jié)果如下: 二、列轉(zhuǎn)行 與行轉(zhuǎn)列相反,有些場景剛好需要這種操作。 示例如下: 1 --列轉(zhuǎn)行 2 create table sc_grade ( 3 id varchar2(64) not null, 4 name varchar2(20) not null, 5 cn_score number(3) not null, 6 math_score number(3) not null, 7 en_score number(3) not null, 8 primary key (id) 9 )10 11 --初始數(shù)據(jù)12 insert into sc_grade values ('10001', '張三', 75, 80, 80);13 insert into sc_grade values ('10002','王五', 92, 78, 82);14 insert into sc_grade values ('10003','趙六', 80, 90, 77);15 insert into sc_grade values ('10004','李四', 86, 66, 81);16 insert into sc_grade values ('10005','李明', 69, 75, 80); 列傳行語句 1 select name '姓名' , '語文' course, cn_score as score from sc_grade2 union 3 select name '姓名' , '數(shù)學(xué)' course, math_score as score from sc_grade4 union 5 select name '姓名' , '英語' course, en_score as score from sc_grade6 order by '姓名' , course 結(jié)果如下: 也可以使用insert all .. into完成。使用insert all ..。 into 需要新建一個表用來保存轉(zhuǎn)換后的數(shù)據(jù)。 表結(jié)構(gòu)如下: 1 -- 結(jié)果存放表2 create table test_sc_grade ( 3 name varchar2(20) not null, 4 course varchar2(100) not null, 5 score number(3) not null 6 ) 執(zhí)行語句如下: 1 insert all 2 into test_sc_grade(name,course,score) values(name, '語文', cn_score) 3 into test_sc_grade(name,course,score) values(name, '數(shù)學(xué)', math_score) 4 into test_sc_grade(name,course,score) values(name, '英語', en_score) 5 select name, cn_score, math_score, en_score from sc_grade; 6 commit; 7 select * from test_sc_grade 結(jié)果查詢與上面截圖一致。 點擊最下角閱讀全文查看“Java開發(fā)之史上最全亂碼解決方案總結(jié)(Java程序員必看)” 有人用微信聊天,有人卻在微信中學(xué)習(xí),成長。下面是2016最HOT IT公眾號,趕快試試新的關(guān)注方法吧! |
|
|