当前位置:   article > 正文

MySQL--case when的用法 以及 利用case when 和 group by 实现行转列_mysql case when group by

mysql case when group by

MySQL–case when的用法

在MySQL中case when有两种用法:

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表

syearsmonthsamount
199011.1
199021.2
199031.3
199041.4
199112.1
199122.2
199132.3
199142.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
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:

1	一季度
2	二季度
3	三季度
4	四季度
1	一季度
2	二季度
3	三季度
4	四季度
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
搜索函数:

CASE WHEN [expr] THEN [result1]…ELSE [default] END

此种用法case 后边不加列名,直接在when后边做条件判断,条件为true则执行后边的then, 不符合则判断下一个 when … else 为默认情况

示例:
score表

snocnodegree
1033-24586
1053-24575
1093-24568
1033-10592
1053-10588
1093-10578
1036-16685
1056-16679
1096-16692

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;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

查询结果:

degree	rank
86	B
75	C
68	D
92	A
88	B
78	C
85	B
79	C
92	A
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

利用case when 和 group by 实现行转列:
示例:
sale表

syearsmonthsamount
199011.1
199021.2
199031.3
199041.4
199112.1
199122.2
199132.3
199142.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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:

syear	一季度	二季度	三季度	四季度
1990	1.1	1.2	1.3	1.4
1991	2.1	2.2	2.3	2.4
  • 1
  • 2
  • 3
为什么要加group by 和 max?

有很多小伙伴会有疑问为什么要加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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以看到上边的结果,每一年的一个季度都只有一个结果,这是因为每一种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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

结果

syear	一季度	二季度	三季度	四季度
1990	1.1	0	0	0
1991	2.1	0	0	0
  • 1
  • 2
  • 3

只写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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/485287
推荐阅读
相关标签
  

闽ICP备14008679号