您的位置:首页 > 其它

一次有趣的case when函数使用经历

2015-07-19 15:07 381 查看
一次在做图表的时候,需要对查询的数据做些处理,也就是要做行列的转换工作,原有的数据格式是这样的:

arearecordmethodnum
00120
00043
01132
010245
其中recordmethod字段1代表web录入,0代表客户端client录入,需要把数据编程这样:

areawebnumclientnum
002043
0132245
刚开始的想法是这样的,结果表中的webnum和clientnum在原表中是没有的,感觉要用case when函数的话需要先把这个字段虚拟出来,于是就先写了这么一句sql:

select area,'0' as webnum,'0' as clientnum, recordmethod,num from table1;


下面就开始使用case when函数:

SELECT
a.area,
CASE
a.webnum
WHEN a.recordmethod=1
THEN a.num
ELSE 0
END AS webnum,
CASE
a.clientnum
WHEN a.recordmethod=0
THEN a.num
ELSE 0
END AS clientnum
FROM table2 as a;


table2就是上一个语句得到的结果表,这句sql逻辑看上去很明白,就是如果recordmethod等于1,就把num值赋值给webnum,等于0则赋值给clientnum,然后在用sum函数汇总一下:

SELECT
b.area,
SUM(b.webnum) AS webnum,
SUM(b.clientnum) AS clientnum
FROM table3 as b GROUP BY b.area;


table3就是使用case when函数后得到的那个结果表,然后就有了下面这样的结果:

areawebnumclientnum
004320
0124532
看到结果顿时就傻眼了,怎么会这样,结果正好一反。反复分析了一下逻辑没错啊,sql语句也执行了说明语法上也没错啊,那怎么出来这个结果。

只好求助搜索引擎了,查看了一下case when函数的的使用,恍然大悟,原来case when函数有两种使用方式,一种是:

case 字段名 when 字段可能的值 then

还有一种是:case when boolean表达式 then

而在mysql中是没有boolean类型的,也就是没有true和false这两个值,它是用数字1和0来分别表示true和false,因此第二个sql中实际上是先判断了boolean表达式,而webnum和clientnum这两个字段我都初始化为0了,因此才出现了这么“理所应当”的结果。

认真的学习了sql之后,发现为了实现这种行列转换,其实没有必要这么复杂,一个语句就可以了:

SELECT
a.area,
SUM(
CASE
WHEN a.recordmethod=1
THEN a.num
ELSE 0
END ) AS webnum,
SUM(
CASE
WHEN a.recordmethod=0
THEN a.num
ELSE 0
END ) AS clientnum
FROM table1;


上面表中的数据只是我模拟的,当时执行完语句后,如果不是对现实情况了解可能就不会觉察结果是相反的。如果把这样的结果呈现给客户,还不知道要闹出怎样的笑话呢。这次有趣的使用经历,也暴露了自己知识的不足,还需要多加磨练啊。

写下此文,为自己做个总结,也给需要使用case when 函数的朋友提个醒,使用函数前一定要对函数的语法做个了解,可不要想当然的就去写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  case-when