本帖最后由 peixin229 于 2010-03-21 20:56:44 编辑

解决方案 »

  1.   

    假设flag=1 为通过初级考试的
    统计各省的  
    slect count(*) from a where province='shanghai' LEFT JOIN {$tablepre}b  ON a.sid=b.sid where b.flag=1
      

  2.   

    感谢各位的及时回复,可能是我没有说明白,如下图所示: 北京:()人 天津:()人 
    上海:()人 重庆:()人 
    其他省份类似上面的 其他省份类似上面的 
    我想统计各省的人数,因为省份很多,如果每个省份写sql语句查询那将要写很多sql语句,是不是需要在建一张表来存储各省学员统计人数?
      

  3.   

    1. 做统计时相关表要做关联,关联分为内关联,左关联,右关联。根据题意只要做左关联即可。
    2. 做完关联后就可以看成是一张表上进行操作了。按某某来统计一般要用到GROUP BY,跟据题意GROUP BY province即可。
    3. GROUP BY之后,其他字段只能用聚合函数(包括COUNT()、AVG()、SUM()、MAX()、MIN()等),根据题意要求得学员数,可以用COUNT(*)。
    4. 求某个带条件的总和怎么求呢?这就要用到COUNT()的高级用法,原来COUNT()里面是带参数的,但只有非NULL的记录才会统计进去。所以我们要构造一个函数,当统计学员是男的是时候出现女(包括非男)的都要改成NULL。如COUNT(NULLIF(gender='男',FALSE))。
    5. GROUP BY之前可以带条件,如题要统计考试通过的人数,如果是求有一门通过的可以用WHERE score>=60总得来说大致SQL如下
    SELECT COUNT(*) AS cnt,COUNT(NULLIF(gender='男',FALSE)),COUNT(NULLIF(gender='女',FALSE)) FROM 学员表 LEFT OUER JOIN 考试表 ON 学员表.sid=考试表.sid GROUP BY province ORDER BY cntSELECT COUNT(*) AS cnt,COUNT(NULLIF(gender='男',FALSE)),COUNT(NULLIF(gender='女',FALSE)) FROM 学员表 LEFT OUER JOIN 考试表 ON 学员表.sid=考试表.sid WHERE 考试表.中级考试score>=60 GROUP BY province ORDER BY cnt