`

mysql存储过程实现行转列

阅读更多
把表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 ;
  • 大小: 25.3 KB
0
4
分享到:
评论

相关推荐

    sql动态行转列 存储过程

    在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在处理具有多个分类或时间序列的数据时特别有用,可以更直观地展示数据。 首先,我们需要创建一个存储过程来执行这个操作。...

    Java实现调用MySQL存储过程详解

    总的来说,Java通过JDBC调用MySQL存储过程涉及到连接数据库、创建`CallableStatement`、执行存储过程和处理结果。这使得开发者能够在Java应用中灵活地利用数据库提供的强大功能,实现更高效的数据处理。

    mysql存储过程动态创建多列

    本文将深入探讨如何利用MySQL存储过程动态创建多列,这是一个高级功能,尤其适用于需要根据运行时变量或条件动态修改表结构的情况。 ### MySQL存储过程动态创建多列 #### 基本概念 在MySQL中,动态地添加列到一个...

    mysql动态行转列

    在 MySQL 中,可以使用存储过程来实现动态行转列。下面是两个示例存储过程,演示如何使用 MySQL 实现动态行转列。 存储过程一: 该存储过程使用 While 循环来生成动态 SQL 语句,然后使用 PREPARE 语句来执行该...

    MySQL实现创建存储过程并循环添加记录的方法

    在MySQL数据库中,存储过程是一种预编译的SQL语句集合,它可以封装一系列的操作,用于执行复杂的业务逻辑。创建存储过程并循环添加记录是数据库管理中的常见任务,尤其是在需要批量插入数据时。以下将详细解释如何在...

    MySQL存储过程中使用动态行转列

    本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。 数据表结构 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表...

    mysql存储过程之返回多个值的方法示例

    MySQL存储过程是数据库中用于执行复杂操作的一组预编译的SQL语句,它们可以接收输入参数、输出结果以及在内部处理数据。在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要...

    mysql存储过程通用分页

    MySQL存储过程实现分页通常涉及以下步骤: 1. **创建存储过程**:首先,我们需要在MySQL数据库中定义一个存储过程,包含必要的输入参数,如每页的记录数(limit_size)和当前页数(current_page)。 ```sql ...

    kettle批量导出mysql存储过程

    总结来说,Kettle批量导出MySQL存储过程涉及到的关键知识点有:Kettle的数据流设计、MySQL的存储过程、数据库元数据获取、循环控制、文件生成和命令行脚本的创建。熟练掌握这些技能,将有助于我们在数据库管理和维护...

    Mysql中行转列算法

    存储过程可以封装复杂的逻辑,包括动态生成SQL语句,从而实现行转列。这种方法适合需要多次重复执行相同操作的场景。 #### 示例解析 让我们通过一个具体的例子来理解如何在MySQL中实现行转列。假设我们有一个销售...

    MySQL实验报告5(存储过程与函数)(1)(1).pdf

    根据提供的文件内容,本篇实验报告主要围绕MySQL数据库中存储过程和函数的应用,涵盖了创建存储过程、函数、游标以及异常处理等高级特性。下面将详细解析报告中的每个知识点。 1. 创建存储过程 存储过程是一种在...

    mysql分页存储过程

    通过上述分析可以看出,这个MySQL分页存储过程实现了灵活且高效的分页查询功能。它不仅能够根据用户提供的参数动态地构建查询语句,还能够处理排序、分组等复杂需求。对于需要频繁进行分页查询的应用场景来说,这种...

    mysql 存储过程应用(代码详解)

    ### MySQL存储过程应用详解 #### 一、存储过程概述 在MySQL中,存储过程是一种预编译好的SQL脚本,可以包含复杂的逻辑控制语句、循环结构以及事务处理等功能。通过存储过程,开发者可以在数据库服务器端执行一系列...

    存储过程写九九乘法表

    本篇文章将详细介绍如何利用存储过程来实现九九乘法表的生成,这种方法非常适合初学者学习。 #### 存储过程的概念 存储过程是存储在服务器上的预先编写的SQL语句集合,它可以在客户端或应用程序请求时被调用执行。...

    将SQL数据表的一列转换为一行.docx

    知识点1:使用存储过程实现数据转换 在 MySQL 中,可以使用存储过程来实现数据转换。存储过程是一种预先编译好的 SQL 语句集合,可以重复使用以提高效率。在这个示例中,我们使用存储过程 `ColToRow` 来将源表的一...

    oracle Mysql相互转化的工具

    4. 触发器和存储过程转换:Oracle和MySQL都有自己的SQL语法和存储过程实现,工具需能处理这类复杂的逻辑转换。 5. 安全性和稳定性:迁移过程中,数据的安全性和迁移过程的稳定性至关重要。工具应有错误处理机制,能...

    MySQL行转列与列转行.pdf

    在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个具体的例子来详细解释如何在MySQL中实现行转...

Global site tag (gtag.js) - Google Analytics