服务类型表
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
...转化成下面的统计方式,服务类型是可扩展的,就是说统计的表的列也是可扩展的

解决方案 »

  1.   

    用一条sql语句能否查出来?还是说要写存储过程根据服务器类型的数量动态创建临时表的列,然后把查询的记过填入临时表,再将临时表的结果查出来?
      

  2.   

    select B.submit_date,count(case when A.id=1 then 1 end) as 服务器重启
    ,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
      

  3.   

    看不到你的图,建议用文本方式贴出。   参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
      

  4.   

    不好意思,我把图转一下
    ---------------------------------------
    服务类型表
    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----...
      

  5.   

    要用SP:
    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 ;
      

  6.   

    参考下贴中的动态的方法。http://blog.csdn.net/ACMAIN_CHM/archive/2009/06/19/4283943.aspx
      

  7.   

    这句话是什么意思
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
      

  8.   

    定义一个句柄为NOT FOUNT,然后设置DONE=1。这个作为游标的结束符用的。意思是如果游标遍历完了,那么设置DONE=1.