student_course NAME COURSE MARK
'张三 ' ‘Java’ 100
'张三 ' ‘Jdbc’ 100
'张三 ' ‘Hibernate’ 20
'李四 ' ‘Java’ 80
'李四 ' ‘Jdbc’ 80
'李四 ' ‘Hibernate’ 80
'王五 ' ‘Java’ 60
'王五 ' ‘Jdbc’ 60
'王五 ' ‘Hibernate’ 60
1.按要求写一条SQL语句显示效果为
NAME JAVA JDBC HIBERNATE
‘张三’ 100 100 20
‘李四’ 80 80 80
‘王五’ 60 60 60答案 select name,
sum(decode(t.course, 'java', t.)) "java",
sum(decode(t.course, 'jdbc', t.)) "jdbc",
sum(decode(t.course, 'hibernate', t.)) "hibernate"
from student_course t
group by t.name;
是正确的,但是为什么要加入SUM这个组函数呢?我试过,将SUM改成其他的组函数貌似也可以,如果不分组会出现9条数据
这又是什么原因呢?真的不是很明白组函数啊!!这个SQL语句的执行顺序是怎么样的也不太清楚,麻烦拿位高手做个详细的解释了,谢谢啊!!
'张三 ' ‘Java’ 100
'张三 ' ‘Jdbc’ 100
'张三 ' ‘Hibernate’ 20
'李四 ' ‘Java’ 80
'李四 ' ‘Jdbc’ 80
'李四 ' ‘Hibernate’ 80
'王五 ' ‘Java’ 60
'王五 ' ‘Jdbc’ 60
'王五 ' ‘Hibernate’ 60
1.按要求写一条SQL语句显示效果为
NAME JAVA JDBC HIBERNATE
‘张三’ 100 100 20
‘李四’ 80 80 80
‘王五’ 60 60 60答案 select name,
sum(decode(t.course, 'java', t.)) "java",
sum(decode(t.course, 'jdbc', t.)) "jdbc",
sum(decode(t.course, 'hibernate', t.)) "hibernate"
from student_course t
group by t.name;
是正确的,但是为什么要加入SUM这个组函数呢?我试过,将SUM改成其他的组函数貌似也可以,如果不分组会出现9条数据
这又是什么原因呢?真的不是很明白组函数啊!!这个SQL语句的执行顺序是怎么样的也不太清楚,麻烦拿位高手做个详细的解释了,谢谢啊!!
'张三 ' ‘Java’ 100
'张三 ' ‘Jdbc’ 100
'张三 ' ‘Hibernate’ 20
'李四 ' ‘Java’ 80
'李四 ' ‘Jdbc’ 80
'李四 ' ‘Hibernate’ 80
'王五 ' ‘Java’ 60
'王五 ' ‘Jdbc’ 60
'王五 ' ‘Hibernate’ 60
select name,
decode(t.course, 'java', t.,0) "java",
decode(t.course, 'jdbc', t.,0) "jdbc",
decode(t.course, 'hibernate', t.,0) "hibernate"
from student_course t
;
你不用分组求和出来的结果是这样的
NAME JAVA jdbc hibernate
'张三 ' 100 0 0
'张三 ' 0 100 0
'张三 ' 0 0 20
'李四 ' 80 0 0
'李四 ' 0 80 0
'李四 ' 0 0 80
'王五 ' 60 0 0
'王五 ' 0 60 0
'王五 ' 0 0 60
因为 t.course 与空值的和为t.course ,最大值也是t,course
若不想出现重复行就必须使用分组,使用分组就必须用到聚合函数不使用的话这种方法也可以
select name,a. java,b. jdbc,c. hibernate from (select * from test_a where course='java') a inner join (select * from
test_a where course='jdbc') b using(name) inner join (select * from test_a where course='hibernate') c using (name) order by a. desc;
按name分组,所以name可以在select后使用,其他字段就必须用聚合函数提取
decode函数里,达到条件的返回course,否则返回null
你只要将course和null合并成一个符合条件的值就行,不一定要用sum函数
执行顺序是select-group by-decode-sum
系统先读出这个一个分组查询语句,检查字段,执行decode返回结果
了解一下decode的用法
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
最好还是用有默认值的。decode(t.course, 'java', t.) 改成 decode(t.course, 'java', t.,0)
就如你所说,不一定需要使用sum,其实max,min等函数都是可以的
只要将course和null结合为适当的值就可以了。
name varchar2(10),
course varchar2(10),
number
);insert into t1(name,course,)
select '张三','java',100 from dual union all
select '张三','jdbc',90 from dual union all
select '张三','Hibernate',80 from dual union all
select '李四','java',100 from dual union all
select '李四','jdbc',78 from dual union all
select '李四','Hibernate',88 from dual union all
select '王五','java',100 from dual union all
select '王五','jdbc',86 from dual union all
select '王五','Hibernate',87 from dual; select
t.name,
decode(t.course,'java',t.) java,
decode(t.course,'jdbc',t.) jdbc,
decode(t.course,'Hibernate',t.) hibernate
from t1 t;
select
t.name,
min(decode(t.course,'java',t.)) java,
min(decode(t.course,'jdbc',t.)) jdbc,
min(decode(t.course,'Hibernate',t.)) hibernate
from t1 t
group by t.name
;
select
t.name,
max(decode(t.course,'java',t.)) java,
max(decode(t.course,'jdbc',t.)) jdbc,
max(decode(t.course,'Hibernate',t.)) hibernate
from t1 t
group by t.name
;
select
t.name,
sum(decode(t.course,'java',t.)) java,
sum(decode(t.course,'jdbc',t.)) jdbc,
sum(decode(t.course,'Hibernate',t.)) hibernate
from t1 t
group by t.name
;
select
t.name,
avg(decode(t.course,'java',t.,0)) java,
avg(decode(t.course,'jdbc',t.,0)) jdbc,
avg(decode(t.course,'Hibernate',t.,0)) hibernate
from t1 t
group by t.name
;