服务类型表
id type_name
1 服务器重启
2 系统部署
3 系统重装
...
工单表
id title type_id submit_date
1 重装 1 2010-5-1
2 部署 2 2010-5-2
3 重装 3 2010-5-3
...转化成下面的统计方式,服务类型是可扩展的,就是说统计的表的列也是可扩展的
id type_name
1 服务器重启
2 系统部署
3 系统重装
...
工单表
id title type_id submit_date
1 重装 1 2010-5-1
2 部署 2 2010-5-2
3 重装 3 2010-5-3
...转化成下面的统计方式,服务类型是可扩展的,就是说统计的表的列也是可扩展的
,count(case when A.id=2 then 1 end) as 系统部署
,count(case when A.id=3 then 1 end) as 系统重装
from tb1 A,tb2 B
where A.id = B.typeid
group by B.submit_date
---------------------------------------
服务类型表
id type_name
1--服务器重启
2--系统部署
3--系统重装
...
工单表
id title type_id submit_date
1--重装----1------2010-5-1
2--部署----2------2010-5-2
3--重装----3------2010-5-3
...转化成下面的日期为行,服务类型为列的数量统计,服务类型是可扩展的,就是说统计的表的列也是可扩展的
日期----服务器重启----系统部署----系统重装 ...
2010-5-1---30----------50--------23----...
2010-5-2---55----------60--------11----...
2010-5-3---33----------56--------87----...
DELIMITER $$USE `testa`$$DROP PROCEDURE IF EXISTS `crossquery`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `crossquery`()
BEGIN
DECLARE asql VARCHAR(500);
DECLARE done INT DEFAULT 0;
DECLARE V_A VARCHAR(500);
DECLARE cur1 CURSOR FOR SELECT b.type_name FROM 工单表 a INNER JOIN 服务类型表 b
ON a.id=b.id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
SET ASQL='select submit_date, ';
OPEN cur1;
FETCH cur1 INTO v_a;
WHILE done=0 DO
SET asql=CONCAT(asql,'sum(if(type_name=\'',v_A,'\'',',1,0)) as `',v_A,'`,');
FETCH cur1 INTO v_a;
END WHILE;
SET ASQL=CONCAT(LEFT(ASQL,CHAR_LENGTH(ASQL)-1),' FROM (SELECT b.type_name,a.* FROM 工单表 a INNER JOIN 服务类型表 b
ON a.id=b.id) a group by submit_date');
SET @ASQL1=ASQL;
PREPARE BB FROM @ASQL1;
EXECUTE BB;
END$$DELIMITER ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;