赞
踩
1.简单函数
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
2.搜索函数
CASE WHEN [expr] THEN [result1]…ELSE [default] END
CASE [col_name] WHEN [value1] THEN [result1]…ELSE [default] END
这种用法就是 匹配列的值,得出对应的结果
示例:
sale表
syear | smonth | samount |
---|---|---|
1990 | 1 | 1.1 |
1990 | 2 | 1.2 |
1990 | 3 | 1.3 |
1990 | 4 | 1.4 |
1991 | 1 | 2.1 |
1991 | 2 | 2.2 |
1991 | 3 | 2.3 |
1991 | 4 | 2.4 |
查询语句:
select smonth,
case smonth
when 1 then '一季度'
when 2 then '二季度'
when 3 then '三季度'
when 4 then '四季度'
else '错误数据'
end as 季度
from sale;
结果:
1 一季度
2 二季度
3 三季度
4 四季度
1 一季度
2 二季度
3 三季度
4 四季度
CASE WHEN [expr] THEN [result1]…ELSE [default] END
此种用法case 后边不加列名,直接在when后边做条件判断,条件为true则执行后边的then, 不符合则判断下一个 when … else 为默认情况
示例:
score表
sno | cno | degree |
---|---|---|
103 | 3-245 | 86 |
105 | 3-245 | 75 |
109 | 3-245 | 68 |
103 | 3-105 | 92 |
105 | 3-105 | 88 |
109 | 3-105 | 78 |
103 | 6-166 | 85 |
105 | 6-166 | 79 |
109 | 6-166 | 92 |
SELECT Score.degree,(
CASE WHEN Score.degree >=90 AND Score.degree <=100 THEN 'A'
WHEN Score.degree >=80 THEN 'B'
WHEN Score.degree >=70 THEN 'C'
WHEN Score.degree >=60 THEN 'D'
WHEN Score.degree <=59 THEN 'E'
ELSE NULL end
) AS rank
FROM score;
查询结果:
degree rank
86 B
75 C
68 D
92 A
88 B
78 C
85 B
79 C
92 A
利用case when 和 group by 实现行转列:
示例:
sale表
syear | smonth | samount |
---|---|---|
1990 | 1 | 1.1 |
1990 | 2 | 1.2 |
1990 | 3 | 1.3 |
1990 | 4 | 1.4 |
1991 | 1 | 2.1 |
1991 | 2 | 2.2 |
1991 | 3 | 2.3 |
1991 | 4 | 2.4 |
查询语句:
select syear,
max(case smonth
when 1 then samount else 0 end) as `一季度`,
max(case smonth
when 2 then samount else 0 end) as `二季度`,
max(case smonth
when 3 then samount else 0 end) as `三季度`,
max(case smonth
when 4 then samount else 0 end) as `四季度`
from sale group by syear;
结果:
syear 一季度 二季度 三季度 四季度
1990 1.1 1.2 1.3 1.4
1991 2.1 2.2 2.3 2.4
有很多小伙伴会有疑问为什么要加group by 和 max,我们且先去掉group by 和max来看看结果:
查询语句
select syear,
(case smonth
when 1 then samount else 0 end) as `一季度`,
(case smonth
when 2 then samount else 0 end) as `二季度`,
(case smonth
when 3 then samount else 0 end) as `三季度`,
(case smonth
when 4 then samount else 0 end) as `四季度`
from sale;
syear 一季度 二季度 三季度 四季度
1990 1.1 0 0 0
1990 0 1.2 0 0
1990 0 0 1.3 0
1990 0 0 0 1.4
1991 2.1 0 0 0
1991 0 2.2 0 0
1991 0 0 2.3 0
1991 0 0 0 2.4
可以看到上边的结果,每一年的一个季度都只有一个结果,这是因为每一种case when的结果就另起了一行,所以有四个季度就有四行。
下边来看看只使用group by 不用 聚合函数的写法
select syear,
(case smonth
when 1 then samount else 0 end) as `一季度`,
(case smonth
when 2 then samount else 0 end) as `二季度`,
(case smonth
when 3 then samount else 0 end) as `三季度`,
(case smonth
when 4 then samount else 0 end) as `四季度`
from sale
group by syear;
结果
syear 一季度 二季度 三季度 四季度
1990 1.1 0 0 0
1991 2.1 0 0 0
只写group by 不加聚合函数的时候,mysql会把该组的第一行数据取出来
根据下边这个不加group by 的情况来看,使用 min ,max,sum这些函数都可以,因为除了正确的值,全部都是0,当然还得根据实际情况来(比如正确的值是负数,再使用max的话,取出来的是0,反而是一个错误的结果)。
syear 一季度 二季度 三季度 四季度
1990 1.1 0 0 0
1990 0 1.2 0 0
1990 0 0 1.3 0
1990 0 0 0 1.4
1991 2.1 0 0 0
1991 0 2.2 0 0
1991 0 0 2.3 0
1991 0 0 0 2.4
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。