一次有趣的case when函数使用经历
2015-07-19 15:07
381 查看
一次在做图表的时候,需要对查询的数据做些处理,也就是要做行列的转换工作,原有的数据格式是这样的:
其中recordmethod字段1代表web录入,0代表客户端client录入,需要把数据编程这样:
刚开始的想法是这样的,结果表中的webnum和clientnum在原表中是没有的,感觉要用case when函数的话需要先把这个字段虚拟出来,于是就先写了这么一句sql:
下面就开始使用case when函数:
table2就是上一个语句得到的结果表,这句sql逻辑看上去很明白,就是如果recordmethod等于1,就把num值赋值给webnum,等于0则赋值给clientnum,然后在用sum函数汇总一下:
table3就是使用case when函数后得到的那个结果表,然后就有了下面这样的结果:
看到结果顿时就傻眼了,怎么会这样,结果正好一反。反复分析了一下逻辑没错啊,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之后,发现为了实现这种行列转换,其实没有必要这么复杂,一个语句就可以了:
上面表中的数据只是我模拟的,当时执行完语句后,如果不是对现实情况了解可能就不会觉察结果是相反的。如果把这样的结果呈现给客户,还不知道要闹出怎样的笑话呢。这次有趣的使用经历,也暴露了自己知识的不足,还需要多加磨练啊。
写下此文,为自己做个总结,也给需要使用case when 函数的朋友提个醒,使用函数前一定要对函数的语法做个了解,可不要想当然的就去写了。
area | recordmethod | num |
---|---|---|
00 | 1 | 20 |
00 | 0 | 43 |
01 | 1 | 32 |
01 | 0 | 245 |
area | webnum | clientnum |
---|---|---|
00 | 20 | 43 |
01 | 32 | 245 |
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函数后得到的那个结果表,然后就有了下面这样的结果:
area | webnum | clientnum |
---|---|---|
00 | 43 | 20 |
01 | 245 | 32 |
只好求助搜索引擎了,查看了一下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 函数的朋友提个醒,使用函数前一定要对函数的语法做个了解,可不要想当然的就去写了。
相关文章推荐
- oracle 注意点汇总
- oracle 行转列
- 一个奇怪的SQL问题:case when 在记录不存在时不生效
- Mysql查询时case when语句的使用
- ORACLE SQL开发where子句之case-when
- CASE WHEN的简单用法
- MYSQL中查询TOP N的问题
- SQL语句之CASE WHEN
- 转载with as、case when、merge into、分析函数over()
- Case when
- SQL中的CASE WHEN语句
- SAS SYNTAX
- 8. 旋转数组的最小数字
- Win7下安装和使用Qt5详细图解
- poj 3320 Jessica's Reading Problem (哈希高级应用)
- linux tcp状态学习
- 二进制浮点数科学计数法
- struts2学习笔记(一)
- 【手把手教学】开启iOS app调试模式
- java创建二叉树并递归遍历二叉树