日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL动态行转列

發布時間:2023/12/31 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)

aidtitle
1111
2222

query result(3 records)

bidaidimagetime
121.gif2007-08-08
222.gif2007-08-09
323.gif2007-08-08

query result(7 records)

idcostdesAutoid
110aaaa1
115bbbb2
120cccc3
280aaaa4
2100bbbb5
260dddd6
3500dddd7

query result(2 records)

12
12
111222

query result(4 records)

123
123
222
1.gif2.gif3.gif
2007-08-082007-08-092007-08-08


query result(4 records)

1234567
1112223
1015208010060500
aaaabbbbccccaaaabbbbdddddddd
1234567
?

轉載于:https://www.cnblogs.com/secbook/archive/2008/04/19/2655306.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的MySQL动态行转列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。