`
azheng270
  • 浏览: 93455 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

一个 mysql 行 转 列 的存储过程

阅读更多
转一个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)

aid title
1 111
2 222

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)

1 2
1 2
111 222

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动态行转列 存储过程

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

    mysql动态行转列

    MySQL 动态行转列 MySQL 动态行转列是指将行数据转换为列数据的过程。在 MySQL 中,可以使用存储过程来实现动态行转列。下面是两个示例存储过程,演示如何使用 MySQL 实现动态行转列。 存储过程一: 该存储过程...

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

    本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...

    Mysql中行转列算法

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

    mysql存储过程动态创建多列

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

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

    首先,确保你已经安装了MySQL数据库,并且在数据库中创建了一个或多个存储过程。例如,`findAllBook`、`pro_test`和`pro_user`都是在`book`数据库中的存储过程。你可以使用MySQL命令行客户端或者可视化工具(如MySQL...

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

    这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表 就简单一点,学生学号、学生姓名两个字段 CREATE TABLE `student` ( `stuid` VARCHAR(16) NOT ...

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

    在MySQL中,我们使用`CREATE PROCEDURE`语句来定义一个存储过程。在给定的示例中,创建了一个名为`myproc`的存储过程: ```sql DELIMITER // -- 更改分隔符,避免与默认的分号冲突 CREATE PROCEDURE myproc() BEGIN...

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

    - count_sch5: 该存储过程接收一个输出参数size,返回表sch中的总行数。使用了“select count(*) into size from sch”语句,将表sch中的行数赋值给size变量。 - count_sch2: 接收两个输出参数s_a和s_id,分别返回表...

    kettle批量导出mysql存储过程

    这可以通过Kettle的"生成文件"步骤实现,每行命令对应一个存储过程的SQL文件。 6. **运行与验证**:导出完成后,用户可以使用命令行工具(如MySQL客户端或shell脚本)运行生成的`.source`文件,逐个执行存储过程的...

    mysql存储过程通用分页

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者编写一系列复杂的SQL语句,封装成一个可重用的模块,以便在需要时调用。在处理大量数据时,特别是进行分页查询,存储过程可以提高效率,减少网络传输,...

    mysql分页存储过程

    本文将深入解析一个MySQL中的分页存储过程,旨在帮助读者理解其工作原理及实现细节。 #### 存储过程概述 存储过程是一种在数据库中预编译好的SQL语句集合,可以接受输入参数、返回输出参数或结果集。使用存储过程...

    MySQL行转列与列转行.pdf

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

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

    SQL 数据表列转换为一行 在数据库管理中,经常会遇到将...这个示例展示了如何使用存储过程、临时表、动态 SQL 语句、 WHILE 循环、CALL 语句、ALTER TABLE 语句和 UPDATE 语句来将 SQL 数据表的一列转换为一行多列。

    MySQL触发器、存储过程、自定义函数、视图示例

    本例中创建了一个存储过程`sp_insert_userinfo`,用于向`userinfo`表中插入数据。 ```sql DELIMITER // CREATE PROCEDURE sp_insert_userinfo ( p_userid INT, p_username VARCHAR(10), p_userbirthday DATE ) ...

Global site tag (gtag.js) - Google Analytics