zoukankan      html  css  js  c++  java
  • MySQL动态行转列

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

    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
     
  • 相关阅读:
    设计模式(六)—原型模式Prototype(创建型)
    hdu_2039_三角形_解题报告
    古代赌局 俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。 有一种赌局是这样的:桌子上放六个匣子,编号是1至6。多位参与者(以下称玩家)可以把
    读《Boost程序库完全开发指南》
    使用HttpSessionListener接口监听Session的创建和失效
    HDU2317:Nasty Hacks
    意淫的需求要不得
    enumerate(s)与range(len(s))的作用是相同
    一种数据展示方式,UI设计新颖,供大家参考(源码部分) (demo已经上传)
    RMAN Compressed Backupset
  • 原文地址:https://www.cnblogs.com/secbook/p/2655306.html
Copyright © 2011-2022 走看看