日期:2014-05-16  浏览次数:20790 次

交叉表查询中文,问题已解决,但是在查询出来的结果却多了一列。帮忙看看哪错了
下边是我写的存储过程:
create procedure test1()

begin
  DECLARE done int default 0;
  DECLARE asubject CHAR(20) character set gbk;
  DECLARE str VARCHAR(1000) default '';
DECLARE cur1 CURSOR FOR select DISTINCT subject from test ;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  open cur1;
  REPEAT
  if not done then
  FETCH cur1 INTO asubject;
  set str=CONCAT(str, ',', 'SUM(if(subject=''', asubject, ''', sources, 0))', '''', asubject,''''); 
  end IF;
  UNTIL done END REPEAT;
  set @sqlString=CONCAT(' select number as 学号',str, ' from test group by number ');
  prepare sqlstmt from @sqlString;
  execute sqlstmt;
  deallocate prepare sqlstmt;

end
结果:

学号 语文 数学 英语 英语1
1 60 70 75 75
2 55 53 75 75
3 80 0 0 0
4 0 0 0 0
5 0 0 91 91
表里面是没有英语1这一科目的,但是查询出来的却多而来这一列

------解决方案--------------------
打印出来这个变量看看就知道了
------解决方案--------------------
set @sqlString=CONCAT(' select number as 学号',str, ' from test group by number ');
这句下面
select @sqlString;
------解决方案--------------------
create procedure test1()

begin
DECLARE done int default 0;
DECLARE asubject CHAR(20) character set gbk;
DECLARE str VARCHAR(1000) default '';
DECLARE cur1 CURSOR FOR select DISTINCT subject from test ;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
open cur1;
REPEAT
FETCH cur1 INTO asubject;
if not done then
set str=CONCAT(str, ',', 'SUM(if(subject=''', asubject, ''', sources, 0))', '''', asubject,'''');
end IF;
UNTIL done END REPEAT;
set @sqlString=CONCAT(' select number as 学号',str, ' from test group by number ');
prepare sqlstmt from @sqlString;
execute sqlstmt;
deallocate prepare sqlstmt;

end