网上的都是一些静态的,用CASE WHEN结构实现。所以我写了一个动态的。
SP 代码:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`sp_row_column_wrap`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_row_column_wrap`(IN $schema_name varchar(64),
IN $table_name varchar(64))
BEGIN
declare cnt int(11);
declare $table_rows int(11);
declare i int(11);
declare j int(11);
declare s int(11);
declare str varchar(255);
-- Get the column number of the table
select count(1) from information_schema.columns where table_schema=$schema_name and table_name=$table_name into cnt;
-- Get the row number of the table
select table_rows from information_schema.tables where table_schema = $schema_name and table_name=$table_name into $table_rows;
-- Check whether the table exists or not
drop table if exists test.temp;
create table if not exists test.temp (`1` varchar(255) not null);
-- loop1 start
set i = 0;
loop1:loop
if i = $table_rows-1 then
leave loop1;
end if;
set @stmt1 = concat('alter table test.temp add `',i+2,'` varchar(255) not null');
prepare s1 from @stmt1;
execute s1;
deallocate prepare s1;
set @stmt1 = '';
set i = i + 1;
end loop loop1;
-- loop1 end;
set s = 0;
-- loop2 start
loop2:loop
-- leave loop2
if s=cnt then
leave loop2;
end if;
set @stmt2 = concat('select column_name from information_schema.columns where table_schema="',$schema_name,
'" and table_name="',$table_name,'" limit ',s,',1 into @temp;');
prepare s2 from @stmt2;
execute s2;
deallocate prepare s2;
set @stmt2 = '';
set j=0;
set str = ' select ';
-- Loop3 start
loop3:loop
if j = $table_rows then
leave loop3;
end if;
set @stmt3 = concat('select ',@temp,' from ',$schema_name,'.',$table_name,' limit ',j,',1 into @temp2;');
prepare s3 from @stmt3;
execute s3;
set str = concat(str,'"',@temp2,'"',',');
deallocate prepare s3;
set @stmt3 = '';
set j = j+1;
end loop loop3;
set str = left(str,length(str)-1);
-- insert new data into table
set @stmt4 = concat('insert into test.temp',str,';');
prepare s4 from @stmt4;
execute s4;
deallocate prepare s4;
set @stmt4 = '';
set s=s+1;
end loop loop2;
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 |
分享到:
相关推荐
MySQL 动态行转列 本文将详细介绍 MySQL 中的动态行转列技术,并提供实践中的应用场景。 标题解释 MySQL 动态行转列是指将数据库中的一行数据转换为多列数据的过程。在本示例中,我们将创建一个存储过程来实现...
MySQL 行转列、列转行、行列汇总、合并显示 MySQL 行转列是一种常用的数据处理操作,用于将同一列下的不同内容的几行数据转换成几列显示。例如,我们有一个成绩表 tb_score,其中包含 userid、subject 和 score 三...
MySQL 提供了两种转换数据布局的方法:行转列(Pivot)和列转行(Unpivot),这在处理复杂的数据汇总和展示时非常有用。本文将深入探讨这两种转换方法,并提供具体的 SQL 语句示例,以及创建示例表结构的 SQL 代码。...
MySQL行转列示例代码,备忘,作为需要用时的参考
在本篇中,我们将深入探讨如何在MySQL中解决复杂的动态行转列问题。 首先,我们要理解行转列的基本概念。在传统的SQL查询中,我们可以使用`CASE`语句配合`GROUP BY`来实现简单的行转列转换,但这种方法往往不适用于...
标题“mysql-行转列、列转行”涉及到的是MySQL中的两种主要转换技巧: 1. **行转列(Pivot)**: 行转列通常用于将多行数据转换为单行的多个列。在MySQL中,没有内置的PIVOT函数,但可以通过使用`CASE`语句配合`...
行转列sql实例行转列sql实例行转列sql实例行转列sql实例行转列sql实例
总之,MySQL中的行转列是数据分析过程中的一种重要技巧,尤其对于处理时间序列数据和分类统计时非常实用。通过灵活运用`CASE`和`GROUP BY`,我们可以将原始数据整理成更符合报告需求的形式,从而更好地理解业务情况...
-- MySQL 行转列 非固定列 2009-4-25 by kim -- CREATE TABLE `expense_log` ( -- `EXPENSE_ID` INT(10) DEFAULT NULL, -- `USER_ID` VARCHAR(45) DEFAULT NULL, -- `TOTAL` INT(11) DEFAULT NULL -- ) ENGINE=...
### MySQL行转列与列转行详解 #### 行转列 在数据库处理过程中,有时候我们需要将表中的数据从行的形式转换为列的形式,这样的操作称为“行转列”。这种需求通常出现在对数据进行汇总或者特定展示时。下面通过一个...
本文将深入探讨MySQL中的行转列算法,并通过具体的例子进行分析,以帮助读者更好地理解和掌握这一技能。 ### MySQL中的行转列算法 行转列操作通常涉及将源表中的某列的不同值转换为结果表中的不同列,同时保留其他...
本文介绍的实例成功的实现了动态行转列。下面我以一个简单的数据库为例子,说明一下。 数据表结构 这里我用一个比较简单的例子来说明,也是行转列的经典例子,就是学生的成绩 三张表:学生表、课程表、成绩表 学生表...
MySQL 提供了一些方法来实现行转列和列转行的操作。本文将通过实例详细讲解这两种转换方式。 首先,我们来看行转列。行转列通常用于将具有多个相关值的同一列数据展示为多列。在 MySQL 中,可以使用 CASE 语句配合...
在本案例中,我们主要探讨如何使用SQL语句,尤其是存储过程,来实现动态的行转列功能。这在处理具有多个分类或时间序列的数据时特别有用,可以更直观地展示数据。 首先,我们需要创建一个存储过程来执行这个操作。...
MySQL行转列操作 所谓的行转列操作,就是将一个表的行信息转化为列信息,说着可能比较笼统,这里先举个例子,如下: +----+-----------+--------+-------+ | ID | USER_NAME | COURSE | SCORE | +----+----------...