我在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这个字段名字,而不是它代表的数据。我该怎么办呢?
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这个字段名字,而不是它代表的数据。我该怎么办呢?
解决方案 »
- Mysql默认编码是latin1,插入中文乱码
- 如何防止因系统意外重启,mysql数据表的修复!
- mysql 文件读取
- 更新语句出现错误,Lock wait timeout exceeded
- MySQL记录指定数据库日志问题
- 单表数据量超60万条就不行了。怎么办。
- 我已经将max_connection设到3000了,为什么看进程的总是中有98,不超过100?
- MySQL 4.11/5.0.0 阿尔法开发版下载
- 请教记录帖子内容的最好方案
- 新手触发器问题求解!!!标题要长!!!!!!!!!!!!!!
- 给位看官,请留步【关于查找满足多个条件绝对相等,描述不清楚,详见内容】。
- mysql中主键、自增长问题
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
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 传入