oracle行转列练习

  1 ----------------------第一题---------------------------
  2 create table STUDENT_SCORE
  3 (
  4   name    VARCHAR2(20),
  5   subject VARCHAR2(20),
  6   score   NUMBER(4,1)
  7 )
  8 
  9 insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '语文', 78.0);
 10 insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '数学', 88.0);
 11 insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '英语', 98.0);
 12 insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '语文', 89.0);
 13 insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '数学', 76.0);
 14 insert into student_score (NAME, SUBJECT, SCORE) values ('李四', '英语', 90.0);
 15 insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '语文', 99.0);
 16 insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '数学', 66.0);
 17 insert into student_score (NAME, SUBJECT, SCORE) values ('王五', '英语', 91.0);
 18 
 19 --emp
 20 /*
 21 显示格式:  
 22        语文              数学                英语  
 23        及格              优秀                不及格   
 24 */
 25 --方法一
 26 select  name,
 27                 (select score from student_score s1 where subject = '语文' and s1.name=s.name) 语文,
 28                 (select score from student_score s1 where subject = '数学' and s1.name=s.name) 数学,
 29                 (select score from student_score s1 where subject = '英语' and s1.name=s.name) 英语
 30   from student_score s group by name
 31  
 32 
 33 
 34 --方法二 decode
 35 select s.name,
 36        sum(decode(subject, '语文',s.score,0)) 语文,
 37        sum(decode(subject, '数学',s.score,0)) 数学,
 38        sum(decode(subject, '英语',s.score,0)) 英语
 39   from student_score s
 40  group by s.name
 41 --方法三 case when
 42 select s.name , sum(case s.subject when '语文' then s.score else 0 end) "语文", 
 43 sum(case s.subject when '数学' then s.score else 0 end) 数学,
 44 sum(case s.subject when '英语' then s.score else 0 end) 英语
 45 from student_score s group by s.name
 46 --方法四
 47 采用 join表连接的方式
 48 
 49 
 50 
 51 --判断及格否
 52 select t.name 名字,
 53        case
 54          when t.y between 90 and 100 then
 55           '优秀' 
 56           when t.y between 60 and 90 then
 57           '及格'
 58           when t.y between 0 and 60 then
 59           '不及格'
 60        end 语文,
 61       case
 62          when t.s between 90 and 100 then
 63           '优秀' 
 64           when t.s between 60 and 90 then
 65           '及格'
 66           when t.s between 0 and 60 then
 67           '不及格'
 68        end 数学,
 69        case
 70          when t.e between 90 and 100 then
 71           '优秀' 
 72           when t.e between 60 and 90 then
 73           '及格'
 74           when t.e between 0 and 60 then
 75           '不及格'
 76        end 英语
 77 
 78   from (
 79         
 80         select s.name,
 81                  sum(decode(subject, '语文', s.score, 0)) y,
 82                 sum(decode(subject, '数学', s.score, 0)) s,
 83                 sum(decode(subject, '英语', s.score, 0)) e
 84           from student_score s
 85          group by s.name) t
 86 
 87 
 88          
 89 -----------------------第二题--------------------------------
 90            
 91 create table test(
 92    id number(10) primary key,
 93    type number(10) ,
 94    t_id number(10),
 95    value varchar2(5)
 96 );
 97 insert into test values(100,1,1,'张三');
 98 insert into test values(200,2,1,'');
 99 insert into test values(300,3,1,'50');
100 /*
101 姓名      性别     年龄
102 --------- -------- ----
103 张三       男        50
104 */
105 
106 
107 
108 --方法一
109 --1
110 select listagg(decode(t.type, 1, t.value)) within group(order by value) 姓名,
111        listagg(decode(t.type, 2, t.value)) within group(order by value) 性别,
112        listagg(decode(t.type, 3, t.value)) within group(order by value) 年龄
113   from test t
114  group by t.t_id
115  
116  --方法二
117  select max(decode(t.type, 1, t.value)) 姓名,
118        max(decode(t.type, 2, t.value)) 性别,
119       max(decode(t.type, 3, t.value))年龄
120   from test t group by t.t_id
121  
122  
123  --方法三表连接方式
124  select * from test
125  
126 select *
127   from (select value name,t_id from test where type = 1) m1
128   join (select value sex,t_id from test where type = 2) m2
129     on m1.t_id = m2.t_id
130  
131  -------------------------第三题-------------------------
132  
133 create table tmp(rq varchar2(10),shengfu varchar2(5))
134 
135 insert into tmp values('2005-05-09','');
136 insert into tmp values('2005-05-09','');
137 insert into tmp values('2005-05-09','');
138 insert into tmp values('2005-05-09','');
139 insert into tmp values('2005-05-10','');
140 insert into tmp values('2005-05-10','');
141 insert into tmp values('2005-05-10','');
142 
143 select * from tmp;
144           胜 负
145 2005-05-09 2 2
146 2005-05-10 1 2
147  
148  
149  --方法一
150  select rq,
151         sum(decode(shengfu, '', 1, '', 0)) 胜,
152         sum(decode(shengfu, '', 0, '', 1)) 负
153    from tmp
154   group by rq
155  
156  
157  
158  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值