我有一段sql语句:
  for i:=1 to 4 do
      begin
        sql.Add('select ' + dbgrid1.fields[i].FieldName  + ' from 表 group by ' + dbgrid1.fields[i].FieldName);
        sql.Add(' having count(distinct ' + adoquery1.fields[5].FieldName  + ')=1');
        adoquery1.Open;
      end;
  运行出错,请指教

解决方案 »

  1.   

    你这样的话最后的sql语句就成了select a from 表 group by a having count(distinct 5)=1 select b from 表 group by a having count(distinct 5)=1 ....
    这样sql语句肯定不对。
      

  2.   

    应该把select和having句放在循环外面。
    而且from 表 group by也放在循环外面。
    你可以在循环里用一个数组存放字段,循环完后在拼凑SQL语句。
      

  3.   

    其实象这样的情况,楼主可以在adoquery1.Open;定一个断点
    然后查看SQL.TEXT的值是什么
    这样,你可以知道错在什么地方了
    var
      i: Integer;
      strSQL: string;
    begin
      for i:=1 to 4 do
      begin
        sql.Add('select ' + dbgrid1.fields[i].FieldName +
                ' from 表 group by ' + dbgrid1.fields[i].FieldName);
        sql.Add(' having count(distinct ' + adoquery1.fields[5].FieldName  + ')=1');
        adoquery1.Open;
      end;
      //改为如下:
      strSQL := ' having count(distinct ' + adoquery1.fields[5].FieldName  + ')=1';  AdoQuery1.Close;
      AdoQuery1.Sql.Text := 'Select ' + dbgrid1.fields[1].FieldName + ','
                                      + dbgrid1.fields[2].FieldName + ','
                                      + dbgrid1.fields[3].FieldName + ','
                                      + dbgrid1.fields[4].FieldName
                          + ' from 表 group by '
                                      + dbgrid1.fields[1].FieldName + ','
                                      + dbgrid1.fields[2].FieldName + ','
                                      + dbgrid1.fields[3].FieldName + ','
                                      + dbgrid1.fields[4].FieldName
                          + strSQL;
      try
        AdoQuery1.Open;
      except
        raise;
      end;
    end;
      

  4.   

    楼主在遇到类似的问题 把SQL语句打出来一看就明了
      

  5.   

    查询之前先 close ,clear  for i:=1 to 4 do
          begin
            close;
            sql.clear;
            sql.Add('select ' + dbgrid1.fields[i].FieldName  + ' from 表 group by ' + dbgrid1.fields[i].FieldName);
            sql.Add(' having count(distinct ' + adoquery1.fields[5].FieldName  + ')=1');
            adoquery1.Open;
          end;
      运行出错,请指教
      

  6.   

    没有统计函数, select sum('+dbgrid1.fields[i].FieldName+') from  表 group by ' + dbgrid1.fields[i].FieldName);
      

  7.   

    建议SQL还是写在TQuery组件里的SQL file里,这样只要你的纯sql在sqlplus或者toad
    里能实现,那就不会出现你所郁闷的问题了
      

  8.   

    各位,我在我的group by 后面使用我的字段名(如:数学成绩)运行没问题,但group by后面用dbgrid1.fields[1].fieldname 程序就出错,‘+dbgrid1.fields[1].fieldname+’也一样。我要用的是循环所以必须要用fields[].fieldname,不知道该怎么改