把表t_rows中的数据转换为列显示
CREATE TABLE `t_rows` (
`dt_str` varchar(20) NOT NULL,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表t_rows行显示的结果为
mysql> SELECT `dt_str`, `name`, `age` FROM `t_rows`;
+----------+-----------+-----+
| dt_str | name | age |
+----------+-----------+-----+
| 20120610 | name_9881 | 81 |
| 20120609 | name_9882 | 82 |
| 20120608 | name_9883 | 83 |
| 20120607 | name_9884 | 84 |
| 20120606 | name_9885 | 85 |
| 20120605 | name_9886 | 86 |
| 20120604 | name_9887 | 87 |
| 20120603 | name_9888 | 88 |
| 20120602 | name_9889 | 89 |
| 20120601 | name_9890 | 90 |
| 20120531 | name_9891 | 91 |
+----------+-----------+-----+
转换为
图片“列显示.jpg”(文字格式有点乱,只好贴图了)的显示方式
dt_str 20120610 20120609 20120608 20120607 20120606 20120605 20120604 20120603 20120602 20120601 20120531
name name_9881 name_9882 name_9883 name_9884 name_9885 name_9886 name_9887 name_9888 name_9889 name_9890 name_9891
age 81 82 83 84 85 86 87 88 89 90 91
存储过程定义:
DELIMITER $$
DROP PROCEDURE IF EXISTS `pr_row_to_col`$$
CREATE DEFINER=`root`@`%` PROCEDURE `pr_row_to_col`()
COMMENT '将表t_row中的3列(`dt_str`, `name`, `age`)数据转换为列显示'
proc_start:BEGIN
DECLARE _end INT DEFAULT 0;
-- 临时表名
DECLARE _TEMP_TB_NAME VARCHAR(255) DEFAULT 't_temp_rows_to_col';
-- 创建存储列数据的表结构sql
DECLARE _sql_create TEXT;
-- 每列数据的拼接的字符串,因为此例只查询3列(`dt_str`, `name`, `age`)数据
-- 假设每列所有行的拼接字符串不超过TEXT,如果超过可以使用longtext等
DECLARE _res_dt,_res_name,_res_age TEXT;
-- 每个数据的长度定义为varchar(255),如果数据最大长度超过255,则改为最大值即可
DECLARE _dt_str,_name,_age VARCHAR(255) DEFAULT '';
-- 分隔符
DECLARE _SPLITER CHAR(1) DEFAULT ',';
-- 查询所有行数据的游标
DECLARE _cur CURSOR FOR SELECT `dt_str`, `name`, `age` FROM t_rows;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _end=1;
-- 打开游标
OPEN _cur;
-- 初始化
SET _res_dt='';
SET _res_name='';
SET _res_age='';
-- drop临时表
SET @exe_str=CONCAT("DROP TABLE IF EXISTS ",_TEMP_TB_NAME);
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 创建存储列数据的表结构sql
SET _sql_create=CONCAT("create table ",_TEMP_TB_NAME,"(");
SET _sql_create=CONCAT(_sql_create,"col0 VARCHAR(255) NOT NULL,");
SET @i=1;
rep_start:REPEAT
FETCH _cur INTO _dt_str, _name, _age;
IF _end=1 THEN
LEAVE rep_start;
END IF;
-- 拼接每列数据的字符串
SET _res_dt=CONCAT(_res_dt,"'",_dt_str,"'",_SPLITER);
SET _res_name=CONCAT(_res_name,"'",_name,"'",_SPLITER);
SET _res_age=CONCAT(_res_age,"'",_age,"'",_SPLITER);
-- 拼接创建表结构字符串
SET _sql_create=CONCAT(_sql_create,"col",@i," VARCHAR(255) NOT NULL,");
SET @i=@i+1;
UNTIL _end=1 END REPEAT rep_start;
-- 截取每个字符串最后的分隔符
SET _res_dt=SUBSTRING(_res_dt,1,(LENGTH(_res_dt)-1));
SET _res_name=SUBSTRING(_res_name,1,(LENGTH(_res_name)-1));
SET _res_age=SUBSTRING(_res_age,1,(LENGTH(_res_age)-1));
SET _sql_create=SUBSTRING(_sql_create,1,(LENGTH(_sql_create)-1));
-- 拼接创建表结构字符串
SET _sql_create=CONCAT(_sql_create,")ENGINE=MEMORY DEFAULT CHARACTER SET utf8");
-- 关闭游标
CLOSE _cur;
-- 创建列数据存储使用的临时表
SET @exe_str=_sql_create;
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 插入列数据,在每列数据前插入了列名
SET @exe_str=CONCAT("INSERT INTO ",_TEMP_TB_NAME," VALUES ('dt_str',",_res_dt,"),('name',",_res_name,"),('age',",_res_age,")");
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 输出行转列后的数据
SET @exe_str=CONCAT("SELECT * FROM ",_TEMP_TB_NAME);
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END proc_start$$
DELIMITER ;
CREATE TABLE `t_rows` (
`dt_str` varchar(20) NOT NULL,
`name` varchar(20) NOT NULL,
`age` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表t_rows行显示的结果为
mysql> SELECT `dt_str`, `name`, `age` FROM `t_rows`;
+----------+-----------+-----+
| dt_str | name | age |
+----------+-----------+-----+
| 20120610 | name_9881 | 81 |
| 20120609 | name_9882 | 82 |
| 20120608 | name_9883 | 83 |
| 20120607 | name_9884 | 84 |
| 20120606 | name_9885 | 85 |
| 20120605 | name_9886 | 86 |
| 20120604 | name_9887 | 87 |
| 20120603 | name_9888 | 88 |
| 20120602 | name_9889 | 89 |
| 20120601 | name_9890 | 90 |
| 20120531 | name_9891 | 91 |
+----------+-----------+-----+
转换为
图片“列显示.jpg”(文字格式有点乱,只好贴图了)的显示方式
dt_str 20120610 20120609 20120608 20120607 20120606 20120605 20120604 20120603 20120602 20120601 20120531
name name_9881 name_9882 name_9883 name_9884 name_9885 name_9886 name_9887 name_9888 name_9889 name_9890 name_9891
age 81 82 83 84 85 86 87 88 89 90 91
存储过程定义:
DELIMITER $$
DROP PROCEDURE IF EXISTS `pr_row_to_col`$$
CREATE DEFINER=`root`@`%` PROCEDURE `pr_row_to_col`()
COMMENT '将表t_row中的3列(`dt_str`, `name`, `age`)数据转换为列显示'
proc_start:BEGIN
DECLARE _end INT DEFAULT 0;
-- 临时表名
DECLARE _TEMP_TB_NAME VARCHAR(255) DEFAULT 't_temp_rows_to_col';
-- 创建存储列数据的表结构sql
DECLARE _sql_create TEXT;
-- 每列数据的拼接的字符串,因为此例只查询3列(`dt_str`, `name`, `age`)数据
-- 假设每列所有行的拼接字符串不超过TEXT,如果超过可以使用longtext等
DECLARE _res_dt,_res_name,_res_age TEXT;
-- 每个数据的长度定义为varchar(255),如果数据最大长度超过255,则改为最大值即可
DECLARE _dt_str,_name,_age VARCHAR(255) DEFAULT '';
-- 分隔符
DECLARE _SPLITER CHAR(1) DEFAULT ',';
-- 查询所有行数据的游标
DECLARE _cur CURSOR FOR SELECT `dt_str`, `name`, `age` FROM t_rows;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _end=1;
-- 打开游标
OPEN _cur;
-- 初始化
SET _res_dt='';
SET _res_name='';
SET _res_age='';
-- drop临时表
SET @exe_str=CONCAT("DROP TABLE IF EXISTS ",_TEMP_TB_NAME);
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 创建存储列数据的表结构sql
SET _sql_create=CONCAT("create table ",_TEMP_TB_NAME,"(");
SET _sql_create=CONCAT(_sql_create,"col0 VARCHAR(255) NOT NULL,");
SET @i=1;
rep_start:REPEAT
FETCH _cur INTO _dt_str, _name, _age;
IF _end=1 THEN
LEAVE rep_start;
END IF;
-- 拼接每列数据的字符串
SET _res_dt=CONCAT(_res_dt,"'",_dt_str,"'",_SPLITER);
SET _res_name=CONCAT(_res_name,"'",_name,"'",_SPLITER);
SET _res_age=CONCAT(_res_age,"'",_age,"'",_SPLITER);
-- 拼接创建表结构字符串
SET _sql_create=CONCAT(_sql_create,"col",@i," VARCHAR(255) NOT NULL,");
SET @i=@i+1;
UNTIL _end=1 END REPEAT rep_start;
-- 截取每个字符串最后的分隔符
SET _res_dt=SUBSTRING(_res_dt,1,(LENGTH(_res_dt)-1));
SET _res_name=SUBSTRING(_res_name,1,(LENGTH(_res_name)-1));
SET _res_age=SUBSTRING(_res_age,1,(LENGTH(_res_age)-1));
SET _sql_create=SUBSTRING(_sql_create,1,(LENGTH(_sql_create)-1));
-- 拼接创建表结构字符串
SET _sql_create=CONCAT(_sql_create,")ENGINE=MEMORY DEFAULT CHARACTER SET utf8");
-- 关闭游标
CLOSE _cur;
-- 创建列数据存储使用的临时表
SET @exe_str=_sql_create;
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 插入列数据,在每列数据前插入了列名
SET @exe_str=CONCAT("INSERT INTO ",_TEMP_TB_NAME," VALUES ('dt_str',",_res_dt,"),('name',",_res_name,"),('age',",_res_age,")");
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 输出行转列后的数据
SET @exe_str=CONCAT("SELECT * FROM ",_TEMP_TB_NAME);
PREPARE stmt FROM @exe_str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END proc_start$$
DELIMITER ;
发表评论
-
linux清除mysql占用cache
2013-11-01 10:55 2041在linux内部将cache分为2种: 1、write/rea ... -
规范、经验
2013-11-04 17:23 585尽量不用NULL列 query cach ... -
mysql模拟队列
2013-05-14 13:42 1091-- 初始化数据 DROP TABLE IF EXIST ... -
高性能mysql[第3版]--笔记
2013-05-03 23:35 06.8 6.8.1 mysql构建消息队列 se ... -
生成随机字符串
2013-04-30 10:41 0DELIMITER $$ CREATE FUNCTIO ... -
复制笔记
2013-04-27 17:48 0http://dev.mysql.com/doc/refman ... -
[整理]mysql导入导出
2013-04-24 22:40 0方案一:拷贝物理文件(innodb, innodb_file_ ... -
【整理中】mysql字符集使用
2013-04-24 22:29 0show variables like 'characte ... -
MYSQL监控内容整理
2013-04-24 13:40 0内容 硬解析,软解析,等待事件,表空间,索引,触发器,alte ... -
无限级联分类查询
2013-04-24 09:36 0DROP TABLE IF EXISTS location ... -
mysqldbcompare --使用
2013-04-07 09:39 0http://dev.mysql.com/doc/workbe ... -
MYSQL 发送数据大小计算公式
2013-03-29 16:20 884引用:http://www.realzyy.com/?p=15 ... -
#mysql 笔记#索引长度限制
2013-03-18 12:11 852http://dev.mysql.com/doc/refman ... -
mysqldump简单使用
2013-01-21 15:27 0mysqldump -B或者--databases:备份指定数 ... -
linux经常登入登出mysql重复输入密码
2013-01-16 17:51 970经常登入、登出mysql,尤其是密码重新输入比较复杂时,使用& ... -
mysql 判断字符串是否是数字
2012-07-12 10:21 2975查询表table_name中col_name(字符串类型)的值 ... -
[转载]drop 大表效率问题
2012-06-15 09:32 46http://www.mysqlops.com/2011/05 ... -
monyog安装文件
2012-03-26 16:29 1275monyog安装包,绿色版 -
linux sysbench+mysql
2012-02-16 17:25 0一、sysbench安装 tar -zxvf ... -
收藏的常用命令
2011-12-28 15:45 0--innobackup 备份到本机上并进行压缩 inn ...
相关推荐
在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在处理具有多个分类或时间序列的数据时特别有用,可以更直观地展示数据。 首先,我们需要创建一个存储过程来执行这个操作。...
总的来说,Java通过JDBC调用MySQL存储过程涉及到连接数据库、创建`CallableStatement`、执行存储过程和处理结果。这使得开发者能够在Java应用中灵活地利用数据库提供的强大功能,实现更高效的数据处理。
本文将深入探讨如何利用MySQL存储过程动态创建多列,这是一个高级功能,尤其适用于需要根据运行时变量或条件动态修改表结构的情况。 ### MySQL存储过程动态创建多列 #### 基本概念 在MySQL中,动态地添加列到一个...
在 MySQL 中,可以使用存储过程来实现动态行转列。下面是两个示例存储过程,演示如何使用 MySQL 实现动态行转列。 存储过程一: 该存储过程使用 While 循环来生成动态 SQL 语句,然后使用 PREPARE 语句来执行该...
在MySQL数据库中,存储过程是一种预编译的SQL语句集合,它可以封装一系列的操作,用于执行复杂的业务逻辑。创建存储过程并循环添加记录是数据库管理中的常见任务,尤其是在需要批量插入数据时。以下将详细解释如何在...
本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。 数据表结构 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表...
MySQL存储过程是数据库中用于执行复杂操作的一组预编译的SQL语句,它们可以接收输入参数、输出结果以及在内部处理数据。在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要...
MySQL存储过程实现分页通常涉及以下步骤: 1. **创建存储过程**:首先,我们需要在MySQL数据库中定义一个存储过程,包含必要的输入参数,如每页的记录数(limit_size)和当前页数(current_page)。 ```sql ...
总结来说,Kettle批量导出MySQL存储过程涉及到的关键知识点有:Kettle的数据流设计、MySQL的存储过程、数据库元数据获取、循环控制、文件生成和命令行脚本的创建。熟练掌握这些技能,将有助于我们在数据库管理和维护...
存储过程可以封装复杂的逻辑,包括动态生成SQL语句,从而实现行转列。这种方法适合需要多次重复执行相同操作的场景。 #### 示例解析 让我们通过一个具体的例子来理解如何在MySQL中实现行转列。假设我们有一个销售...
根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...
通过上述分析可以看出,这个MySQL分页存储过程实现了灵活且高效的分页查询功能。它不仅能够根据用户提供的参数动态地构建查询语句,还能够处理排序、分组等复杂需求。对于需要频繁进行分页查询的应用场景来说,这种...
### MySQL存储过程应用详解 #### 一、存储过程概述 在MySQL中,存储过程是一种预编译好的SQL脚本,可以包含复杂的逻辑控制语句、循环结构以及事务处理等功能。通过存储过程,开发者可以在数据库服务器端执行一系列...
本篇文章将详细介绍如何利用存储过程来实现九九乘法表的生成,这种方法非常适合初学者学习。 #### 存储过程的概念 存储过程是存储在服务器上的预先编写的SQL语句集合,它可以在客户端或应用程序请求时被调用执行。...
知识点1:使用存储过程实现数据转换 在 MySQL 中,可以使用存储过程来实现数据转换。存储过程是一种预先编译好的 SQL 语句集合,可以重复使用以提高效率。在这个示例中,我们使用存储过程 `ColToRow` 来将源表的一...
4. 触发器和存储过程转换:Oracle和MySQL都有自己的SQL语法和存储过程实现,工具需能处理这类复杂的逻辑转换。 5. 安全性和稳定性:迁移过程中,数据的安全性和迁移过程的稳定性至关重要。工具应有错误处理机制,能...
在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个具体的例子来详细解释如何在MySQL中实现行转...