大概的想法是:利用一元数组arro表示access中的test表的8个列(id1..id8),二元数组arrt表示test表中8个列的一一组合(id1+id2,id1+id3...id7+id8)
然后利用i,j作循环,insert数据到新表中,其中数据包括test表中8个列的一一组合的名字,用arrt[i,j]来循环引用表示;另外还有组合的两列同为1时的求和值,用arro[j]或arro[i]来表示。
请高手指教,下面的代码错在哪里了,小弟新手,不胜感激!
procedure TForm1.Button3Click(Sender: TObject);
const arro :Array [1..8] of string = ('id1','id2','id3','id4','id5','id6','id7','id8');
var tempInt:string;
     i:integer;
     j:integer;
     arrt :Array [1..8,1..8] of string;
begin
for i:=1 to 8 do
begin
for j:=1 to 8 do
begin
arrt[i,j]:=('+arro[i]+'+'+arro[j]+');
tempint:=arro[j];
with adoquery1 do
begin
close;
sql.Clear;
sql.add('insert into '+edit1.text+'(item ,num) select "arrt[i,j]", sum(tempint) from test where '+arro[i]+'=1 and '+arro[j]+'=1');
open;
end;
end;
end;
end;

解决方案 »

  1.   

    //处为修改处
    procedure TForm1.Button3Click(Sender: TObject); 
    const arro :Array [1..8] of string = ('id1','id2','id3','id4','id5','id6','id7','id8'); 
    var tempInt:string; 
         i:integer; 
         j:integer; 
         arrt :Array [1..8,1..8] of string;   
         str: string;
    begin 
    for i:=1 to 8 do 
    begin 
    for j:=1 to 8 do 
    begin 
    arrt[i,j]:=(arro[i]+ '+'+arro[j]);//
    tempint:=arro[j]; 
    str := 'insert into result (item ,num) select '+arrt[i,j]+', sum('+tempint+') from test where '+arro[i]+'=1 and '+arro[j]+'=1 group by '+arrt[i,j]+'';//
    with adoquery1 do 
    begin 
    close; 
    sql.Clear; 
    sql.add(str); 
    ExecSQL;//
    end; 
    end; 
    end; 
    end;
      

  2.   

    这个帖子好像好里见过:
    http://topic.csdn.net/u/20080518/10/f031480e-b6a9-48db-b93e-3291aa202cb2.htmlsql.Clear; 
    sql.add('insert into '+edit1.text+'(item ,num) select "arrt[i,j]", sum(tempint) from test where '+arro[i]+'=1 and '+arro[j]+'=1'); 
    open;改成:
    sql.Clear; 
    sql.add('insert into '+edit1.text+'(item ,num) select '+arrt[i,j]+', sum('+tempint+') from test where '+arro[i]+'=1 and '+arro[j]+'=1 group by '+arrt[i,j]+''); 
    ExecSql;