DBFreeTel表存放需要排除的号码
DBName是总的数据表(String型变量)
目的汇总DBName表中排除号码以外的TimeLong现在这段程序有问题,不排除号码的话统计正常,排除号码后的数据竟然大于总的数据。不知道什么地方出现问题其中:
DateStr为int型标志日期的变量
EndTime为TDateTime型变量
Ckfree.Checked为是否启用排除功能/--------
 try
 with ADOQ do
 begin
 close;
 SQL.Clear;
 SQL.Add('SELECT Sum('+DBName+'.TimeLong)/60 AS 时长 ');
 SQL.Add('FROM '+DBName);
 if Ckfree.Checked then SQL.Add(',DBFreeTel ');
 SQL.Add('WHERE ('+DBName+'.SrcBox = 0) ');
 if Ckfree.Checked then SQL.Add(' AND ('+DBName+'.TelCode<>DBFreeTel.TelCode) ');
 SQL.Add(' AND ('+DBName+'.DateStr >= :VBeginDate) ');
 SQL.Add(' AND ('+DBName+'.DateStr <= :VEndDate) ');
 SQL.Add(' AND ('+DBName+'.EndTime BETWEEN :VBeginTime and :VEndTime) ');
 parameters.ParamByName('VBeginDate').Value:=GetDateint(DTBegin.DateTime);
 parameters.ParamByName('VEndDate').Value:=GetDateint(DTEnd.DateTime);
 parameters.ParamByName('VBeginTime').Value:=StrToDateTime(FindTimeStr(DTBegin.DateTime,CBBeginTime.Text,True));
 parameters.ParamByName('VEndTime').Value:=StrToDateTime(FindTimeStr(DTEnd.DateTime,CBEndTime.Text,False));
 ExecSQL;
 Active:=True;
 Stdata.Caption:='条件汇总';
 end;
 except
 end;

解决方案 »

  1.   

    这句有问题:SQL.Add(' AND ('+DBName+'.TelCode<>DBFreeTel.TelCode) ');
    改为
    SQL.Add(' AND ('+DBName+'.TelCode not in(select distinct TelCode from DBFreeTel) ');
    或者与之等效的not exists语句(如果数据量很大not in 效率要低一些)
      

  2.   

    if Ckfree.Checked then SQL.Add(',DBFreeTel ');这句就不要了
      

  3.   

    if Ckfree.Checked then SQL.Add(',DBFreeTel ');
     if Ckfree.Checked then SQL.Add(' AND ('+DBName+'.TelCode<>DBFreeTel.TelCode) ');
    把这两句改了...
      

  4.   

    To StarRains(星雨) 
    按照你的方法会对Sum的值多统计几次,次数是DBFreeTel中号码的个数,比方说有3个号码,统计值就是这三个号码的的共同和值
      

  5.   

    这句if Ckfree.Checked then SQL.Add(',DBFreeTel ');注释掉了吗?不能加这句的,我上面说了