ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:20.30KB ,
资源ID:27641704      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27641704.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(CASE 分组.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

CASE 分组.docx

1、CASE 分组窗体底端SQL中的CASE WHEN用法2012-03-22 15:00:46 我来说两句 收藏 我要投稿 Java代码 SQL中Case的使用方法 Case具有两种格式。简单Case函数和Case搜索函数。 -简单Case函数 CASE sex WHEN 1 THEN 男 WHEN 2 THEN 女 ELSE 其他 END -Case搜索函数 CASE WHEN sex = 1 THEN 男 WHEN sex = 2 THEN 女 ELSE 其他 END 这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判

2、断式。 还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。 -比如说,下面这段SQL,你永远无法得到“第二类”这个结果 CASE WHEN col_1 IN ( a, b) THEN 第一类 WHEN col_1 IN (a) THEN 第二类 ELSE其他 END 下面我们来看一下,使用Case函数都能做些什么事情。 一,已知数据按照另外一种方式进行分组,分析。 有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key) 国家(country)人口(population) 中国600 美国100 加拿大100

3、 英国200 法国300 日本250 德国200 墨西哥50 印度250 根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。 洲人口 亚洲1100 北美洲250 其他700 想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。 如果使用Case函数,SQL代码如下: SELECT SUM(population), CASE country WHEN 中国 THEN 亚洲 WHEN 印度 THEN 亚洲 WHEN 日本 THEN 亚洲 WHEN 美国 THEN 北美洲 WHEN 加拿大 THEN 北美洲 WHEN

4、 墨西哥 THEN 北美洲 ELSE 其他 END FROM Table_A GROUP BY CASE country WHEN 中国 THEN 亚洲 WHEN 印度 THEN 亚洲 WHEN 日本 THEN 亚洲 WHEN 美国 THEN 北美洲 WHEN 加拿大 THEN 北美洲 WHEN 墨西哥 THEN 北美洲 ELSE 其他 END; 同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下; SELECT CASE WHEN salary 500 AND salary 600 AND salary 800 AND salary = 1000 THEN 4

5、 ELSE NULL END salary_class, COUNT(*) /聚合 FROM Table_A GROUP BY CASE WHEN salary 500 AND salary 600 AND salary 800 AND salary 1000 THEN 1 ELSE 0 END ELSE 1 END ) 如果单纯使用Check,如下所示 CONSTRAINT check_salary CHECK ( sex = 2 AND salary 1000 ) 女职员的条件倒是符合了,男职员就无法输入了。 四,根据条件有选择的UPDATE。 例,有如下更新条件 工资以上的职员,工资减少

6、% 工资在到之间的职员,工资增加% 很容易考虑的是选择执行两次UPDATE语句,如下所示 -条件 UPDATE Personnel SET salary = salary * 0.9 WHERE salary = 5000; -条件 UPDATE Personnel SET salary = salary * 1.15 WHERE salary = 2000 AND salary = 5000 THEN salary * 0.9 WHEN salary = 2000 AND salary 4600 THEN salary * 1.15 ELSE salary END; 这里要注意一点,最后一行

7、的ELSE salary是必需的,要是没有这行,不符合这两个条件的人的工资将会被写成NUll,那可就大事不妙了。在Case函数中Else部分的默认值是NULL,这点是需要注意的地方。 这种方法还可以在很多地方使用,比如说变更主键这种累活。 一般情况下,要想把两条数据的Primary key,a和b交换,需要经过临时存储,拷贝,读回数据的三个过程,要是使用Case函数的话,一切都变得简单多了。 p_key col_1 col_2 a 1 张三 b 2 李四 c 3 王五 假设有如上数据,需要把主键a和b相互交换。用Case函数来实现的话,代码如下 UPDATE SomeTable SET p_k

8、ey = CASE WHEN p_key = a THEN b WHEN p_key = b THEN a ELSE p_key END /必须的否则返回kon WHERE p_key IN (a, b); 同样的也可以交换两个Unique key。需要注意的是,如果有需要交换主键的情况发生,多半是当初对这个表的设计进行得不够到位,建议检查表的设计是否妥当。 五,两个表数据是否一致的检查。 Case函数不同于DECODE函数。在Case函数中,可以使用BETWEEN,LIKE,IS NULL,IN,EXISTS等等。比如说使用IN,EXISTS,可以进行子查询,从而实现更多的功能。 下面具个例

9、子来说明,有两个表,tbl_A,tbl_B,两个表中都有keyCol列。现在我们对两个表进行比较,tbl_A中的keyCol列的数据如果在tbl_B的keyCol列的数据中可以找到,返回结果Matched,如果没有找到,返回结果Unmatched。 要实现下面这个功能,可以使用下面两条语句 -使用IN的时候 SELECT keyCol, CASE WHEN keyCol IN ( SELECT keyCol FROM tbl_B ) THEN Matched ELSE Unmatched END Label FROM tbl_A; -使用EXISTS的时候 SELECT keyCol, CAS

10、E WHEN EXISTS ( SELECT * FROM tbl_B WHERE tbl_A.keyCol = tbl_B.keyCol ) THEN Matched ELSE Unmatched END Label FROM tbl_A; 使用IN和EXISTS的结果是相同的。也可以使用NOT IN和NOT EXISTS,但是这个时候要注意NULL的情况。 六,在Case函数中使用合计函数 假设有下面一个表 学号(std_id) 课程ID(class_id) 课程名(class_name) 主修flag(main_class_flg) 100 1 经济学Y 100 2 历史学N 200 2

11、 历史学N 200 3 考古学Y 200 4 计算机N 300 4 计算机N 400 5 化学N 500 6 数学N 有的学生选择了同时修几门课程(100,200)也有的学生只选择了一门课程(300,400,500)。选修多门课程的学生,要选择一门课程作为主修,主修flag里面写入Y。只选择一门课程的学生,主修flag为N(实际上要是写入Y的话,就没有下面的麻烦事了,为了举例子,还请多多包含)。 现在我们要按照下面两个条件对这个表进行查询 只选修一门课程的人,返回那门课程的ID 选修多门课程的人,返回所选的主课程ID 简单的想法就是,执行两条不同的SQL语句进行查询。 条件 -条件:只选择了一

12、门课程的学生 SELECT std_id, MAX(class_id) AS main_class FROM Studentclass GROUP BY std_id HAVING COUNT(*) = 1; 执行结果 STD_ID MAIN_class - - 300 4 400 5 500 6 条件 -条件:选择多门课程的学生 SELECT std_id, class_id AS main_class FROM Studentclass WHERE main_class_flg = Y ; 执行结果 STD_ID MAIN_class - - 100 1 200 3 如果使用Case函数,

13、我们只要一条SQL语句就可以解决问题,具体如下所示 SELECT std_id, CASE WHEN COUNT(*) = 1 -只选择一门课程的学生的情况 THEN MAX(class_id) ELSE MAX(CASE WHEN main_class_flg = Y THEN class_id ELSE NULL END ) END AS main_class FROM Studentclass GROUP BY std_id; 运行结果 STD_ID MAIN_class - - 100 1 200 3 300 4 400 5 500 6 通过在Case函数中嵌套Case函数,在合计函数

14、中使用Case函数等方法,我们可以轻松的解决这个问题。使用Case函数给我们带来了更大的自由度。 最后提醒一下使用Case函数的新手注意不要犯下面的错误 CASE col_1 WHEN 1 THEN Right WHEN NULL THEN Wrong END 在这个语句中When Null这一行总是返回unknown,所以永远不会出现Wrong的情况。因为这句可以替换成WHEN col_1 = NULL,这是一个错误的用法,这个时候我们应该选择用WHEN col_1 IS NULL。 数据库 有一张表table1 结构如下. table1: username action - A CALL A SEARCH A SEARCH B CALL B SEARCH A SEARCH A VIDEO B SEARCH B VIDEO A CALL B VIDEO - 通过一条SQL语句得出下列统计数据: table2 username CALL_TIMES SEARCH_TIMES VIDEO_TIMES - A 2 3 1 B 1 2 2 - 说明: table.action 中所有可能的值都已知的,只有 CALL , SEARCH ,VIDEO 和 table2 的字段一一对应

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1