表如下:名单  质量   数量
小麦   优质  20
大米    一般 20
小麦   优质  50
大米    一般 20
小麦   差    55
DataModule1.AQueryzhanji.Close;
Datamodule1.AQueryzhanji.SQL.Clear;
DataModule1.AQueryzhanji.SQL.Add('select * from 表 order by 日期 DESC');  //查询所有;
DataModule1.AQueryzhanji.Open;DataModule1.AdoQueryGoal.Close;
Datamodule1.AdoQueryGoal.SQL.Clear;
DataModule1.AdoQueryGoal.SQL.Add('select count(*) from 表 where 结果=''优质''');
DataModule1.AdoQueryGoal.Open;
  win:=DataModule1.ADOQueryGoal.Fields[0].value; DataModule1.AdoQueryGoal.Close;
 Datamodule1.AdoQueryGoal.SQL.Clear;
 DataModule1.AdoQueryGoal.SQL.Add('select count(*) from 表 where 结果=''一般''');
 DataModule1.AdoQueryGoal.Open;
 DataModule1.AdoQuery.Close;
 Datamodule1.AdoQuery.SQL.Clear;
 DataModule1.AdoQuery.SQL.Add('select count(*) from 表 where 结果='差''');
 DataModule1.AdoQuery.Open;分别要计算出优质、差、一般的记录数,用三个QUERY查询,在数据量大时会很慢,甚至出现死机……如何简便?能否有简单的方法?
用下面这个简化的sql这么写为什么不能通过呢?
DataModule1.AdoQuery1.Close;
Datamodule1.AdoQuery1.SQL.Clear;
DataModule1.AdoQuery1.SQL.Add('select q4.cnt as allcnt,q1.cnt as q1cnt,q2.cnt as q2cnt,q3.cnt as q3cnt
from
(select count(*) as cnt from qxkz where qxid=0)as q1,
(select count(*) as cnt from qxkz where qxid=1)as q2,
(select count(*) as cnt from qxkz where qxid=2)as q3,
(select count(*) as cnt from qxkz)as q4
');DataModule1.AdoQuery1.Open;

解决方案 »

  1.   

    在查询前ADOQREYR.disnabledcontry;
    查询结束后ADOQRERY.enabledcontry;
      

  2.   

    点名要我来回答,还称高手,我汗我上次看到你这个问题,
    使用SQLSERVER2000环境,
    用查询分析器,对我的qxkz表中的qxid分别为0,1,2的记录数进行了统计,
    输出结果正确。
    不知道你的为什么不能用,
    你用的是SQLServer的数据库吗?我给一份程序,你看看能不能通过,(适用于SQLServer2000环境)
    DataModule1.AdoQuery1.Close;
    Datamodule1.AdoQuery1.SQL.Clear;
    DataModule1.AdoQuery1.SQL.Add('select q4.cnt as allcnt,q1.cnt as q1cnt,q2.cnt '+
    ' as q2cnt,q3.cnt as q3cnt from '+
    ' (select count(*) as cnt from [表] where [结果]=''优质'')as q1, '+
    ' (select count(*) as cnt from [表] where [结果]=''一般'')as q2, '+
    ' (select count(*) as cnt from [表] where [结果]=''差'')as q3, '+
    ' (select count(*) as cnt from [表])as q4 ');
    DataModule1.AdoQuery1.Open;
    这样,allcnt返回总记录数,q1cnt返回优质记录数,q2cnt返回一般记录数,q3cnt返回差记录数。当然了,如果用SQLSERVER2000,还可以把这个工作放在服务器端执行,用存储过程返回结果。
      

  3.   

    如果你需要一次获得统计结果我建议你使用下面的SQL语句:select 结果, count(*) from 表 
    group by 结果
      

  4.   

    select 名单,质量,count(*) from table group by 名单,质量  

    select 质量,count(*) from table group by 质量