我在MySQL中执行查询,查询会用行列互换方法生成2维表,这个运行是OK的。
use ctd;
set @EE="";
SELECT @EE:=CONCAT(@EE,'Sum(IF(Owner=\'',Owner,'\'',',1,0)) AS \'',Owner,'\',') 
FROM (SELECT DISTINCT Owner FROM testcase) A; SET @QQ=CONCAT(
'SELECT ifnull(Brand_id,\'total\'),',
LEFT(@EE,char_LENGTH(@EE)-1),
' ,count(*) AS TOTAL FROM testcase GROUP BY Brand_id WITH ROLLUP'
);PREPARE stmt2 FROM @QQ;
EXECUTE stmt2 然后我想把这些查询语句转换到存储过程里。x,y分别是希望生成2维表的动态字段,由客户指定,这样最后会按照x字段生成x轴,y字段生成y轴。我做了一个实验,写了下面的语句DELIMITER $$CREATE PROCEDURE `ctd`.`iSSUEAnalyse` (in x varchar(100),in y varchar(100))
BEGIN
DECLARE done INT DEFAULT 0;
declare str varchar(800) default('');set @str='';
SELECT @str:=CONCAT(@str,'Sum(IF(A.a=\'',a,'\'',',1,0)) AS \'',
Left(a,5),'\',') 
FROM (SELECT DISTINCT concat(x) as a FROM testcase) A;End Procedure
我发现CONCAT(@str,'Sum.....',a,....)这里a不是我期望的字段的值,而是字段的名字。比如我调用 call iSSUEAnalyse('owner','Brand');
执行时这个CONCAT()里的a是owner这个字段名字,而不是它代表的数据。我该怎么办呢?

解决方案 »

  1.   

    testcase结构、内容是什么,为什么要concat?
      

  2.   

    TestCase表 :
    Owner  Brand       Type ....
    张三   冒烟测试    A
    李四   集成测试    B
    王五   回归测试    C
    concat的目的是为了生成行列互换的表。参考:http://blog.chinaunix.net/uid-7692530-id-2567582.html我刚才又做了另一个尝试,简化了存储过程。
    use ctd;
    set @sql=concat("SELECT @str:=CONCAT(@str,'Sum(IF(owner=\'',","owner",",'\'',',1,0)) AS \'',
    Left(",'owner',",5),'\',') 
    FROM (SELECT DISTINCT owner FROM testcase) A;");
    call iSSUEAnalyse('Owner','Brand_id',@sql);
    我把SQL语句传给存储过程。但是我发现owner这个字段还是没有被替换成字段值。
    DELIMITER $$CREATE PROCEDURE `ctd`.`iSSUEAnalyse` (in x varchar(100),in y varchar(100),in sqlstr varchar(1000))
    BEGIN
    set @str='';
    set @sqlstr=sqlstr;
    PREPARE s1 FROM @sqlstr;
    EXECUTE s1;
    DEALLOCATE PREPARE s1;
    select @str;End
      

  3.   

    SET @str='';
    SELECT @str:=CONCAT(@str,'Sum(IF(owner=\'',`owner`,'\'',',1,0)) AS `',
     `owner`,'`,') 
     FROM (SELECT DISTINCT `owner` FROM testcase) A;
     
     SET @str=CONCAT('select `owner`,',LEFT(@str,CHAR_LENGTH(@str)-1),' from testcase group by `owner` ');
     SELECT @Str;
     PREPARE stml FROM @str;
     EXECUTE stml;OR
    调用你的SP,将@STR 传入
      

  4.   

    查询了一些帖子,尝试使用了动态SQL,这样穿进去的列名该被替换时就被替换了。