转一个mysql 行 转 列 的存储过程
DELIMITER$$
DROPPROCEDUREIFEXISTS`test`.`sp_row_column_wrap`$$
CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_row_column_wrap`(IN$schema_namevarchar(64),
IN$table_namevarchar(64))
BEGIN
declarecntint(11);
declare$table_rowsint(11);
declareiint(11);
declarejint(11);
declaresint(11);
declarestrvarchar(255);
--Getthecolumnnumberofthetable
selectcount(1)frominformation_schema.columnswheretable_schema=$schema_nameandtable_name=$table_nameintocnt;
--Gettherownumberofthetable
selecttable_rowsfrominformation_schema.tableswheretable_schema=$schema_nameandtable_name=$table_nameinto$table_rows;
--Checkwhetherthetableexistsornot
droptableifexiststest.temp;
createtableifnotexiststest.temp(`1`varchar(255)notnull);
--loop1start
seti=0;
loop1:loop
ifi=$table_rows-1then
leaveloop1;
endif;
set@stmt1=concat('altertabletest.tempadd`',i+2,'`varchar(255)notnull');
prepares1from@stmt1;
executes1;
deallocateprepares1;
seti=i+1;
endlooploop1;
--loop1end;
sets=0;
--loop2start
loop2:loop
--leaveloop2
ifs=cntthen
leaveloop2;
endif;
set@stmt2=concat('selectcolumn_namefrominformation_schema.columnswheretable_schema="',$schema_name,
'"andtable_name="',$table_name,'"limit',s,',1into@temp;');
prepares2from@stmt2;
executes2;
deallocateprepares2;
setj=0;
setstr='select';
--Loop3start
loop3:loop
ifj=$table_rowsthen
leaveloop3;
endif;
set@stmt3=concat('select',@temp,'from',$schema_name,'.',$table_name,'limit',j,',1into@temp2;');
prepares3from@stmt3;
executes3;
setstr=concat(str,'"',@temp2,'"',',');
deallocateprepares3;
setj=j+1;
endlooploop3;
setstr=left(str,length(str)-1);
--insertnewdataintotable
set@stmt4=concat('insertintotest.temp',str,';');
prepares4from@stmt4;
executes4;
deallocateprepares4;
sets=s+1;
endlooploop2;
END$$
DELIMITER;
以下是测试结果:
======
select * from a;
select * from b;
select * from salary;
call sp_row_column_wrap('test','a');
select * from test.temp;
call sp_row_column_wrap('test','b');
select * from test.temp;
call sp_row_column_wrap('test','salary');
select * from test.temp;
query result(2 records)
query result(3 records)
bid |
aid |
image |
time |
1 |
2 |
1.gif |
2007-08-08 |
2 |
2 |
2.gif |
2007-08-09 |
3 |
2 |
3.gif |
2007-08-08 |
query result(7 records)
id |
cost |
des |
Autoid |
1 |
10 |
aaaa |
1 |
1 |
15 |
bbbb |
2 |
1 |
20 |
cccc |
3 |
2 |
80 |
aaaa |
4 |
2 |
100 |
bbbb |
5 |
2 |
60 |
dddd |
6 |
3 |
500 |
dddd |
7 |
query result(2 records)
query result(4 records)
1 |
2 |
3 |
1 |
2 |
3 |
2 |
2 |
2 |
1.gif |
2.gif |
3.gif |
2007-08-08 |
2007-08-09 |
2007-08-08 |
query result(4 records)
1 |
2 |
3 |
4 |
5 |
6 |
7 |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
10 |
15 |
20 |
80 |
100 |
60 |
500 |
aaaa |
bbbb |
cccc |
aaaa |
bbbb |
dddd |
dddd |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
分享到:
相关推荐
在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在处理具有多个分类或时间序列的数据时特别有用,可以更直观地展示数据。 首先,我们需要创建一个存储过程来执行这个操作。...
MySQL 动态行转列 MySQL 动态行转列是指将行数据转换为列数据的过程。在 MySQL 中,可以使用存储过程来实现动态行转列。下面是两个示例存储过程,演示如何使用 MySQL 实现动态行转列。 存储过程一: 该存储过程...
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...
存储过程可以封装复杂的逻辑,包括动态生成SQL语句,从而实现行转列。这种方法适合需要多次重复执行相同操作的场景。 #### 示例解析 让我们通过一个具体的例子来理解如何在MySQL中实现行转列。假设我们有一个销售...
本文将深入探讨如何利用MySQL存储过程动态创建多列,这是一个高级功能,尤其适用于需要根据运行时变量或条件动态修改表结构的情况。 ### MySQL存储过程动态创建多列 #### 基本概念 在MySQL中,动态地添加列到一个...
首先,确保你已经安装了MySQL数据库,并且在数据库中创建了一个或多个存储过程。例如,`findAllBook`、`pro_test`和`pro_user`都是在`book`数据库中的存储过程。你可以使用MySQL命令行客户端或者可视化工具(如MySQL...
这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表 就简单一点,学生学号、学生姓名两个字段 CREATE TABLE `student` ( `stuid` VARCHAR(16) NOT ...
在MySQL中,我们使用`CREATE PROCEDURE`语句来定义一个存储过程。在给定的示例中,创建了一个名为`myproc`的存储过程: ```sql DELIMITER // -- 更改分隔符,避免与默认的分号冲突 CREATE PROCEDURE myproc() BEGIN...
- count_sch5: 该存储过程接收一个输出参数size,返回表sch中的总行数。使用了“select count(*) into size from sch”语句,将表sch中的行数赋值给size变量。 - count_sch2: 接收两个输出参数s_a和s_id,分别返回表...
这可以通过Kettle的"生成文件"步骤实现,每行命令对应一个存储过程的SQL文件。 6. **运行与验证**:导出完成后,用户可以使用命令行工具(如MySQL客户端或shell脚本)运行生成的`.source`文件,逐个执行存储过程的...
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者编写一系列复杂的SQL语句,封装成一个可重用的模块,以便在需要时调用。在处理大量数据时,特别是进行分页查询,存储过程可以提高效率,减少网络传输,...
本文将深入解析一个MySQL中的分页存储过程,旨在帮助读者理解其工作原理及实现细节。 #### 存储过程概述 存储过程是一种在数据库中预编译好的SQL语句集合,可以接受输入参数、返回输出参数或结果集。使用存储过程...
### MySQL行转列与列转行详解 #### 行转列 在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个...
SQL 数据表列转换为一行 在数据库管理中,经常会遇到将...这个示例展示了如何使用存储过程、临时表、动态 SQL 语句、 WHILE 循环、CALL 语句、ALTER TABLE 语句和 UPDATE 语句来将 SQL 数据表的一列转换为一行多列。
本例中创建了一个存储过程`sp_insert_userinfo`,用于向`userinfo`表中插入数据。 ```sql DELIMITER // CREATE PROCEDURE sp_insert_userinfo ( p_userid INT, p_username VARCHAR(10), p_userbirthday DATE ) ...