加在case后面是为了分类,加在where后面是用来过滤的 比如你想把成绩分为不及格(<60),及格(>=60 and <90)和优秀(>=90) 那这个条件就要放在Case后面 如果得到及格(>=60)的成绩中大于90的科目数 那这个条件>=60就应该放在where后
count 是聚合函数,后面不能用where的 要+限定条件的话用having
select 学号,nvl(count(case when 成绩>=90 then 'a' else null end),0) 大于90分科目数 from 表 group by 学号 having 学号=1 或者 select 学号,nvl(count(case when 成绩>=90 then 1 else null end),0) 大于90分科目数 from 表 group by 学号 having 学号=1 这里的'a'和1随便写,只代表返回了行数,如果为null就表示不返回行
from 表
group by 学号
比如还有一个学期的字段
我查询:学号为1的学生在某个学期的大于90分的科目数,该怎么写呢?
from 表
WHERE SNO=1
group by 学号
from 表
group by 学号
from 表
group by 学号 求和用SUM啊!
可以加的,如下:
select 学号,sum(case when 成绩>=90 then 1 else 0 end) 大于90分科目数
from 表 where 学号=1
group by 学号
学号为1的学生,比如有5条记录
查出结果就是:学号 科目数
1 5怎么回事呀?我用了“count(case when 成绩>=90 then 1 else 0 end) ”了呀?
什么时候用count啊
因为case when 成绩>=90 then 1 else 0 end这句已经把所有科目的成绩分为大于90(1)和小于90(0)
两种了,如果一个学生有五科,那么这个学生就会有5条记录,其中可能有几条记录值为0
用count就会得到5,因为它计算记录数,但是你是为了得到大于90的,也就是值为1,所以就用sum
还有一个问题:如果还有其他的一些条件,把条件加在case后面和加在where后面有什么区别?
比如你想把成绩分为不及格(<60),及格(>=60 and <90)和优秀(>=90)
那这个条件就要放在Case后面
如果得到及格(>=60)的成绩中大于90的科目数
那这个条件>=60就应该放在where后
from 表
group by 学号
having 学号=1
或者
select 学号,nvl(count(case when 成绩>=90 then 1 else null end),0) 大于90分科目数
from 表
group by 学号
having 学号=1
这里的'a'和1随便写,只代表返回了行数,如果为null就表示不返回行