首页 >数据库 >mysql教程 >MySQL的动态行转列的实现方法_MySQL

MySQL的动态行转列的实现方法_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB原创
2016-06-01 13:50:151978浏览

bitsCN.com

   网上的都是一些静态的,用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;

bitsCN.com
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn