机柜表:network_cabinets(ID int,COMP_LOCA_ID int,HEIGHT int,USE_HEIGHT int)
机房表:computer_location(ID int,NAME varchar)
其中,COMP_LOCA_ID是机房表的ID,HEIGHT是机柜的高度,USE_HEIGHT是已经使用的高度
现在要统计每个机房的机柜总数、未使用机柜总数(即已使用高度为空或等于0)、
未满机柜数(即已使用高度不为空并且大于0,并且高度-已使用高度>0)
已满机柜数(即已使用高度不为空并且大于0,并且高度=已使用高度)
说明:有的机房没有机柜,统计小项不存在的计0显示效果如下: 
机房名称                机柜总计    未使用机柜数    未满机柜数   已满机柜数北京中电华通工体机房    6            2  4   0
北京联通亦庄机房        42           0 32   10                
香港PCCWIDC机房       0            0   0           0  
广州电信七星岗机房       116          46                14          56         

解决方案 »

  1.   

    select l.NAME,
    count(*) as 机柜总计,
    sum(if(r.USE_HEIGHT is null or r.USE_HEIGHT=0,1,0)) as 未使用机柜数,
    sum(if(r.USE_HEIGHT>0 and r.USE_HEIGHT<r.HEIGHT,1,0)) as 未满机柜数,
    sum(if(r.USE_HEIGHT>=r.HEIGHT,1,0)) as 已满机柜数
    from network_cabinets r,computer_location l
    where r.COMP_LOCA_ID=l.ID
    group by l.NAME
      

  2.   

    贴记录出来看看
    select a.name,count(*) as 机柜总计,sum(if(ifnull(USE_HEIGHT,0)=0,1,0)) as 未使用机柜数 ,
    sum(if(ifnull(USE_HEIGHT,0)>0 and HEIGHT-USE_HEIGHT>0,1,0)) as 未满机柜数,
    sum(if(ifnull(USE_HEIGHT,0)>0 and HEIGHT=USE_HEIGHT,1,0)) as 已满机柜数from computer_locatio a left join network_cabinets b on a.id=b.COMP_LOCA_ID
    group by a.name
      

  3.   

    说明:有的机房没有机柜,统计小项不存在的计0
    香港PCCWIDC机房        0      0  0       0 如果要显示这个,则如下:select l.NAME,
    count(*) as '机柜总计',
    sum(if(r.USE_HEIGHT is null or r.USE_HEIGHT=0,1,0)) as '未使用机柜数',
    sum(if(r.USE_HEIGHT>0 and r.USE_HEIGHT<r.HEIGHT,1,0)) as '未满机柜数',
    sum(if(r.USE_HEIGHT>=r.HEIGHT,1,0)) as '已满机柜数'
    from computer_location l left join network_cabinets r on l.ID=r.COMP_LOCA_ID
    group by l.NAME
      

  4.   

    select a.name,count(*) as 机柜总计,ifnull(sum(if(ifnull(USE_HEIGHT,0)=0,1,0)),0) as 未使用机柜数 , 
    ifnull(sum(if(ifnull(USE_HEIGHT,0)>0 and HEIGHT-USE_HEIGHT>0,1,0)),0) as 未满机柜数, 
    ifnull(sum(if(ifnull(USE_HEIGHT,0)>0 and HEIGHT=USE_HEIGHT,1,0)),0) as 已满机柜数 from computer_locatio a left join network_cabinets b on a.id=b.COMP_LOCA_ID 
    group by a.name
      

  5.   

    修正了一下错误。select l.NAME,
        count(r.ID) as '机柜总计',
        sum(if(r.ID is not null and (r.USE_HEIGHT is null or r.USE_HEIGHT=0),1,0)) as '未使用机柜数',
        sum(if(r.USE_HEIGHT>0 and r.USE_HEIGHT<r.HEIGHT,1,0)) as '未满机柜数',
        sum(if(r.USE_HEIGHT>=r.HEIGHT,1,0)) as '已满机柜数'
    from computer_location l left join network_cabinets r on l.ID=r.COMP_LOCA_ID
    group by l.NAMEmysql> select l.NAME,
        ->     count(r.ID) as '机柜总计',
        ->     sum(if(r.ID is not null and (r.USE_HEIGHT is null or r.USE_HEIGHT=0),1,0)) as '未使用机柜数',
        ->     sum(if(r.USE_HEIGHT>0 and r.USE_HEIGHT<r.HEIGHT,1,0)) as '未满机柜数',
        ->     sum(if(r.USE_HEIGHT>=r.HEIGHT,1,0)) as '已满机柜数'
        -> from computer_location l left join network_cabinets r on l.ID=r.COMP_LOCA_ID
        -> group by l.NAME;
    +----------------------+----------+--------------+------------+------------+
    | NAME                 | 机柜总计 | 未使用机柜数 | 未满机柜数 | 已满机柜数 |
    +----------------------+----------+--------------+------------+------------+
    | 香港PCCWIDC机房      |        0 |            0 |          0 |          0 |
    | 北京联通亦庄机房     |        0 |            0 |          0 |          0 |
    | 北京中电华通工体机房 |        0 |            0 |          0 |          0 |
    | 广州电信七星岗机房   |        0 |            0 |          0 |          0 |
    +----------------------+----------+--------------+------------+------------+
    4 rows in set (0.00 sec)mysql>
      

  6.   

    /* Formatted on 2009/06/30 13:22 (Formatter Plus v4.8.0) */
    SELECT   b.ID, MAX (b.NAME), NVL (COUNT (a.ID), 0) AS "机柜总计",
             SUM (CASE
                     WHEN a.use_height IS NULL OR a.use_height = 0
                        THEN 1
                     ELSE 0
                  END
                 ) AS "未使用机柜数",
             SUM (CASE
                     WHEN a.use_height > 0 AND a.height > a.use_height
                        THEN 1
                     ELSE 0
                  END
                 ) AS "未满机柜数",
             SUM (CASE
                     WHEN a.use_height > 0 AND a.height = a.use_height
                        THEN 1
                     ELSE 0
                  END
                 ) AS "已满机柜数"
        FROM network_cabinets a, computer_location b
       WHERE b.ID = a.comp_loca_id(+)
    GROUP BY b.ID
      

  7.   

    验证了一下5楼的代码,结果正确!
    呵呵,顺便学会IF的使用,多谢5楼的xd。