SELECT s.GBSYICDDM,
      (SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL=0 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S0,
    (SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 1 AND 4 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S1,
     (SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 5 AND 9 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S5,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 10 AND 14 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S10,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 14 AND 19 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S15,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 20 AND 24 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S20,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 25 AND 29 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S25,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 30 AND 34 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S30,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 35 AND 39 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S35,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 40 AND 44 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S40,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 45 AND 49 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S45,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 50 AND 54 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S50,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 55 AND 59 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S55,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 60 AND 64 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S60,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 65 AND 69 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S65,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 70 AND 74 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S70,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 75 AND 79 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S75,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL BETWEEN 80 AND 84 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S80,
(SELECT COUNT(1) FROM TB_SMTJ_SWBKB B 
WHERE b.GBSYICDDM=s.GBSYICDDM 
AND b.SZNL>=85 AND TO_CHAR(B.SWRQ,'yyyy')='2009') S85
       FROM TB_SMTJ_SWBKB S GROUP BY s.GBSYICDDM像这种语句该怎样处理最合理,或者是有其它代替?谢谢各位,在线等待!!!

解决方案 »

  1.   

    b.SZNL BETWEEN 1 AND 4 
    大概看了下你的语句,主要是B.SZNL在变化导致的查询,先把所有记录分组后在进行统计,例如
    增加一个字段(gp)对B.SZNL进变换,当B.SZNL最后一位是1-4之间都变换为0,是5-9之间都变换为1,这样
    你的记录变为这样
    .........B.SZNL,0
    ...............,0
    ...............,0
    ...............,0
    ...............,0
    ...............,1
    ...............,1
    ...............,1
    ...............,1
    ...............,1
    ...............,10
    .....
    统计的时候就很简单了,
    SELECT COUNT(1)
    FROM (变换后的表)
    group by gp
      

  2.   

    如果是你那样的话就只有0和1这两组了,我是想根据s.GBSYICDDM字段分组得到不同年龄组的统计。
      

  3.   

    count(case when ....)不就可以替代了吗,何必要用子查询做字段。