最近写个小程序,把EXCEL当数据库来查询,七八个结构一样的文件进行统计查询
语句就是类似下面这样的:
select count(*) as total from [Sheet1$] where english>80
select sum(总分) as ok from [Sheet1$] where name>'陈媛媛'这样的查询很多,大概几十个查询语句,文件也很大,每个文件记录有几十万行
我反复的rs.Close再rs.Open感觉慢得要命现在就想问问,有没有快一点的方法,是不是可以让这些SQL语句都集中起来,可是WHERE条件不一样怎么写在一起呢?

解决方案 »

  1.   


      SELECT 总记录数=(select count(*) as total from [Sheet1$] where english>80),
             总分=(select sum(总分) as ok from [Sheet1$] where name>'陈媛媛')
      

  2.   

    增加速度:ADD INDEX 
    查询条件:OR 
      

  3.   

    首先要分析 WHERE条件不一样  有什么规律
    然后用代码生成SQL……
      

  4.   

    既然查询很多,就不要每次都rs.Close再rs.Open
    不用关闭,直接执行open
      

  5.   

    ...open之后在同一个过程里面不close会报错.
    查询的条件不同是小的方面,查询的数据不同(目的)是关键.
    如果要查询的数据是相同结构,或者性质一样,才可以将条件直接连起来.
      

  6.   

    是的,都是EXCEL,都是一样的结构,一个FOR循环查询这些表格
    查询语句多,文件多,好慢,真烦躁ameken的方法我试了,怎么没什么效果呢?
      

  7.   

    再说具体点的要求
    比如我要查询语文、英语、数学三个学科成绩不为空的,我要写三个查询语句查询三次
    如何用一个查询得到三个结果?要完整的可以用的SQL再比如我要查询语文80分以上,85分以上,90分以上,80到85分之间,85到90分之间,90分到95分之间的总人数,我要写好多查询语句一个一个查询,有没有办法一次查询就得到这些结果呢?难道我要select * from [sheet1$] 然后一个一个算?
      

  8.   


    create table tu(
    id int,
    name varchar(8),
    courge varchar(16),
    score int
    );Load Data InFile 'd:/text2.txt' Into Table `tu` Fields Terminated By ',';text2.txt
    1,a,yuwen,78
    1,b,yuwen,90
    1,c,shuxue,85
    1,d,yuwen,72
    1,e,yinyue,88
    1,a,shuxue,92
    1,b,yingwen,81
    1,c,yingwen,70
    1,d,yinyue,75
    1,e,shuxue,92
    1,f,yingwen,71
    1,g,yingwen,80
    mysql> select * from masterdata.tu;
    +------+------+---------+-------
    +  | id   | name | couage  | score |  
    +------+------+---------+-------
    +  | 1    | a    | yuwen   |    78 |
       |    1 | b    | yuwen   |    90 |
       |    1 | c    | shuxue  |    85 |
       |    1 | d    | yuwen   |    72 |
       |    1 | e    | yinyue  |    88 |
       |    1 | a    | shuxue  |    92 |
       |    1 | b    | yingwen |    81 |
       |    1 | c    | yingwen |    70 |
       |    1 | d    | yinyue  |    75 |
       |    1 | e    | shuxue  |    92 |
       |    1 | f    | yingwen |    71 |
       |    1 | g    | yingwen |    80 |
       +------+------+---------+-------+ 
     12 rows in set (0.01 sec)          mysql> select elt(interval(score,0,80,86,90),"0-79","80-85","86-89",">90") as score,count(*) as totalperson from masterdata.tu group by elt(interval(score,0,80,86,90),"0-79","80-85","86-89",">90");                                           
    +-------+-------------+                                                         
    | score | totalperson |                                                         
    +-------+-------------+                                                         
    | 0-79  |           5 |                                                         
    | 80-85 |           3 |                                                         
    | 86-89 |           1 |                                                         
    | >90   |           3 |                                                         
    +-------+-------------+                                                         
    4 rows in set (0.00 sec)                                                               
      

  9.   

    再说具体点的要求
    比如我要查询语文、英语、数学三个学科成绩不为空的,我要写三个查询语句查询三次
    如何用一个查询得到三个结果?要完整的可以用的SQL 如何用一个查询得到三个结果?  是一个查询3个结果集(这个实现不了),还是一个结果集?
      

  10.   

    比如我要分别查询语文、英语、数学三个学科成绩不为空的人数
    我自己试了一下,select * from [sheet1$]然后一个一个判断,不为空就+1,遍历一次就够了,得到3个结果的速度还快些
    用3个查询语句查询三次得到这3个结果,慢太多了
      

  11.   

    SELECT Count(*) AS C0,
           COUNT(chinese) AS C1,
           COUNT(english) AS C2,
           COUNT(mathematics) AS C3
      FROM [Sheet1$]
    返回的为总数和三个学科非空的记录数,分别减一下就处理了。SELECT chinese\5 AS G,
           COUNT(*)
      FROM [Sheet1$]
     GROUP BY chinese\5
    用整除将每 5 分一个段落的数量统计出来了,你只要遍历记录,将数量加到各个对应的输出项上。
      

  12.   

    楼主想法太多了
     数据量大就应该考虑数据库了 EXCEL不建议做这么细的统计
      

  13.   

    用EXCEL做有些难度,可以有VB的风格控件。