MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 3250|回复: 0
打印 上一主题 下一主题

[Java相关] mysql行转列的处理(存储过程+预制语句+动态SQL)

[复制链接]
跳转到指定楼层
1#
发表于 2014-12-6 11:19:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhangzhufu12 于 2014-12-6 11:21 编辑

个人总结的关于mysql行转列中动态拼接SQL语句的实例(无参数)拿来与大家分享:

BEGIN
/*测试行转列 测试表 t2,测试数据:*/
/*
转载请注明出处,谢谢!
创建人:zhangzhufu 2014-12-4 14:10:54
*/
/*
伪代码:
1.从表中获取动态列名和动态列值
2.使用group_concat函数组合列名,组合列值
3.使用函数统计列名个数
4.使用函数拆分列名用于拼接创建临时表sql语句
5.使用函数拆分列值用于拼接向临时表插入数据语句
6.遍历临时表
备注:1.预制语句必须用用户变量来接收
           2.预制语句必须满足标准sql语法,非数字类型变量必须加单双引号,区别使用
           3.预制语句必须为单一sql语句
           4.预制语句中包含不定列的sql子句必须事先将其设置为空字符串,不可默认使用null
*/
DECLARE c                 VARCHAR(255)    DEFAULT NULL;  -- 接收课程名称
DECLARE s                 VARCHAR(255)    DEFAULT NULL;  -- 接收成绩
DECLARE k                 INT                        DEFAULT 0;          -- 列名称数量
DECLARE varg            INT                        DEFAULT 1;          -- 变量g
DECLARE sql2             VARCHAR(255)   DEFAULT '';           -- 动态sql子句

#获取列名列值字符串
SELECT GROUP_CONCAT(crouse),GROUP_CONCAT(scord) INTO c,s FROM t2 WHERE 1 = 1;
#获取列个数
SET k = (length(c)-length(replace(c,',',''))+1);

#循环拼接动态sql语句
WHILE varg <= k DO
        # 拼写SQL子句,返回结果为一行记录
        SET sql2 = CONCAT(sql2,',',mysql_splitString(s,varg),' ','as',' ',mysql_splitString(c,varg));
        SET varg = varg+1; -- 循环条件
END WHILE;
#消除第一个逗号
SET sql2 = SUBSTR(sql2,2);
#拼接动态sql总句
SET @sql1 = CONCAT('CREATE TEMPORARY TABLE pkd select ', sql2);  

#预执行动态SQL语句
PREPARE rowtocolumn FROM @sql1 ;
#预览sql1 = CREATE TEMPORARY TABLE pkd select 66 as 语文,77 as 数学,88 as 英语,99 as 物理;
#执行动态sql
EXECUTE rowtocolumn;
#遍历临时表
SELECT * FROM pkd;
#删除临时表
DROP TABLE pkd;
#解除预处理
DEALLOCATE PREPARE rowtocolumn;

#SELECT sql1;

END


注:表结构图片添加有误,如有需要请查看原地址
引用地址:http://zhangzhufu12.blog.163.com/blog/static/1634120252014116105734264/

行转列示例表.png (3.66 KB, 下载次数: 37)

行转列示例表.png

行转列后效果.png (2.78 KB, 下载次数: 28)

行转列后效果.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-25 17:21 , Processed in 0.092422 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表