mysql中的动态行转列

本文介绍了一个MySQL存储过程的实例,通过动态构建SQL语句实现数据汇总,展示如何根据不同的月份对数据进行聚合计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql 中设置为支持中文
vi etc
/my.cnf   
[mysqld]   
#
add
default-character-set =gb2312   
建表
drop table table_name
create table table_name( mon varchar(10),per varchar(10),value int)
插入数据
insert into table_name
select '一月','张三',10 UNION all 
select '二月','李四',30 UNION all 
select '三月','王五',50 UNION all 
select '四月','陈六',60 UNION all 
select '五月','刘七',78 UNION all 
select '一月','陈八',90 

存储过程aa
DELIMITER $$

DROP PROCEDURE IF EXISTS `radius`.`aa`$$

CREATE DEFINER=`root`@`%PROCEDURE `aa`()
BEGIN
#tangwf  2007-11-23
        
declare $stm varchar(500);
      
declare $rowcnt int;
      
declare $mycnt int;
      
declare $i int;
      
set $mycnt = 0;
      
set $i = 1;
       
set $stm='select per';
      
select count(distinct mon) into $rowcnt from table_name;
      
WHILE $i<=$rowcnt DO
         
set @i :=0;
          
select col from (select (@i := @i +1 ) as iden,CONCAT($stm,',SUM(case mon when ''',mon,''' then value else 0 end) as ''',mon,''''as col from (select distinct mon from table_name) as tb) as tb1  where iden=$i into $stm;
      
Set $i:=$i+1;
      
END WHILE;
       
Set @stm=concat($stm,' from table_name group by per;');
     
prepare s from @stm;
    
execute s;
    
deallocate prepare s;
        
END$$

DELIMITER ;


执行存储过程
call aa()
结果
per    一月    二月    三月    四月    五月
李四    
0    30    0    0    0
刘七    
0    0    0    0    78
王五    
0    0    50    0    0
张三    
10    0    0    0    0
陈六    
0    0    0    60    0
陈八    
90    0    0    0    0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值