mysql行转列的实例
来源:互联网 发布:民航货运员 知乎 编辑:程序博客网 时间:2024/05/24 04:34
准备表和数据:
CREATE TABLE `user` ( `name` varchar(50) DEFAULT NULL, `subject` varchar(50) DEFAULT NULL, `score` int(11) DEFAULT NULL);insert into user values('zhangsan' , 'chinese' , 10),('zhangsan' , 'math' , 20),('zhangsan' , 'english' , 30),('lily' , 'chinese' , 40),('lily' , 'math' , 50),('lily' , 'english' , 60),('mini' , 'chinese' , 70),('mini' , 'math' , 80),('mini' , 'english' , 90);
case when 实现行转列
select name,sum( case subject when 'chinese' then score else 0 end) as 'chinese',sum( case subject when 'math' then score else 0 end) as 'math',sum( case subject when 'english' then score else 0 end) as 'english'from usergroup by name;
存储过程实现行转列
create procedure line_to_col()begin declare i int; declare _chinese int; declare _math int; declare _english int; declare _name varchar(10); declare test_cursor CURSOR for select name from user; select count(*) into i from user; CREATE TEMPORARY TABLE tmp_tab( name varchar(10), chinese_score int, math_socre int, english_score int); if i> 0 then open test_cursor; repeat fetch test_cursor into _name; select score into _chinese from user where subject = 'chinese' and name =_name; select score into _math from user where subject = 'math' and name =_name; select score into _english from user where subject = 'english' and name =_name; insert into tmp_tab values(_name,_chinese,_math,_english); set i=i-1; until i=0 end repeat; close test_cursor; end if; select DISTINCT * from tmp_tab; drop table tmp_tab;end
在写存储过程的时候遇到了两个问题,分别是关于游标和临时表。
因为user表中有重复的name,在设置游标时,我想直接过滤掉重复的用户,所以将游标设置成declare test_cursor CURSOR for select DISTINCTname from user;这样设置游标之后,执行存储过程,报错提示没有获取任何数据。小小同志跟我解释说,游标是遍历用的,怎么能distinct呢 ,只能对取数做distinct。
为了拼接输出内容,我建了一个临时表,第一次调用line_to_col的时候可以正常执行,第二次调用时就报错提示tmp_tab已存在。所以在存储过程中创建临时表,执行完后,需要及时把临时表删除掉,避免重复调用时出错。另外,小小跟我强调,临时表是放在内存里的,会耗资源,所以在用完之后需要及时删除掉。
- mysql行转列的实例
- mysql的简单实例
- mysql触发器的实例
- mysql 行转列实例
- mysql 创建表的实例
- mysql 数据库的操作实例
- mysql多实例的配置
- mysql服务实例的函数
- 授予MySQL用户权限的实例
- mysql数据表的连接实例
- 【mysql】触发器的实例详解
- Mysql的存储过程实例
- mysql的索引与实例
- 实例MYSQL
- mysql实例
- MySQL 实例
- MySql实例
- Struts分页显示MYSQL数据的实例~~~
- find - grep in linux
- Advanced Evasion Technique高级逃逸技术测试工具
- unix编程艺术心得(更新ing)
- JVM中的Hello World
- 孙鑫vc++第一章在vs2008中运行
- mysql行转列的实例
- 财经法规税收征收管理法律制度练习题一
- 如何调用DLL (基于Visual C++6.0的DLL编程实现)
- 自己封装的Android sqlite-helper.jar包使用方法
- java 接收字符
- hadoop介绍 - Hadoop secondarynamenode concept
- INF安装信息文件7
- 使用java反射编写通用的toString()方法
- [互联网面试笔试汇总C/C++-6] 迅雷