论坛上,关于记录横排的语句:
  有一个表:   
  BH             GZLB           JE   
  ----------------------   
  001             A               100   
  001             B               150   
  001             C               110   
  002             A               99   
  002             B               180   
  002             C               150   
  003             A               160   
  003             B               170   
  003             C               130   
  用SQL语句如何将上面的表变成下面横向的排列方式呢。   
  BH         A       B       C   
  -------------------   
  001     100     150   110   
  002     99       180   150   
  003     160     170   130         
  (GZLB   里面的字段是动态的,不是只有A,B,C   可能还有A,B,C,D,E...)   
使用的语句为:
declare   @sql   varchar(6000)   
      set   @sql   =   'select bh,   '  
      select   @sql   =   @sql +' sum(case GZLB when '''+ GZLB +''' then JE else null end) ['+ GZLB +'],' from (select distinct GZLB as GZLB from tblA) tmp   
      set   @sql   =   substring(@sql,1,len(@sql)-1)+' from tblA group by BH'
exec(@sql)   哪位高手帮忙改成mysql的语句,谢谢。

解决方案 »

  1.   

    set @ee=' ';set @i=1;
    drop TEMPORARY TABLE IF EXISTS qqtt;
    CREATE TEMPORARY TABLE qqtt as
    select @i:=@i+1 as newi,
    @ee:=concat(@ee,'sum(case when GZLB=''',GZLB,''' then je else 0 end) as ',gzlb,',') as newjl 
    from 
    ( select distinct GZLB as GZLB from ttmh) a order by newi desc limit 1;
    select newjl from qqtt into @z2;
    set @z2=concat('select bh,',left(@z2,length(@z2)-1),' from ttmh group by BH' );
    select @z2;
    PREPARE stmt2 FROM @z2;
    EXECUTE stmt2 
      

  2.   

    sp:
    DELIMITER $$
      drop PROCEDURE if exists `zz`.`tryq` $$
    CREATE PROCEDURE `zz`.`tryq`()
        
        BEGIN
    declare z2 varchar(200);
    declare aa int;
    set @ee=' ';set @i=1;
    select @i:=@i+1 as newi,
    @ee:=concat(@ee,'sum(case when GZLB=''',GZLB,''' then je else 0 end) as ',gzlb,',') as newjl 
    into aa,z2
    from 
    ( select distinct GZLB as GZLB from ttmh) a order by newi desc limit 1;
    set @z2=concat('select bh,',left(z2,length(z2)-1),' from ttmh group by BH' );
    select @z2;
    PREPARE stmt2 FROM @z2;
    EXECUTE stmt2 ;    END$$DELIMITER ;
      

  3.   

    去掉上述代码中select @z2; 是调试的时候用的
      

  4.   

    可以
    在你的MySQL所在的主机上定时执行一个脚本,比如下面这个命令。[code=BatchFile]mysql -u userid -ppasswd mydb -e 'insert into teacherCalendar(teacherId,date) select id,CURDATE() from teacher;'[/code]这样每天可以把所有教师在表teacherCalendar添加当日的记录,你可以在主机定在早上5点运行.Linux下见参见crontab命令, windows下则简单,直接看计划任务就行了