有一表list1:
字段      f1  f2  f3  f4  f5  f6  f7  f8  f9  f10
记录1     a    b  c   m   m   m   m   1    2   3
记录2     d    e  f   m   m   m   m   4    5   6
记录3     g    h  h   i   j   k   o   12   13  14
.
.
想用一SQL语句,使其生成另外一个表list2:(凡list1中,f4,f4,f6,f7四个字段相同的记录,f8,f9,f10都要累加,全并成一条记录)
字段      f1  f2  f3  f4  f5  f6  f7  f20  f30  f40
记录1     a    b  c   m   m   m   m   5    7   9
记录2     g    h  h   i   j   k   o   12   13  14我用这样的语句:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  F_DM2.ClientDataSet1.Close;
  F_DM2.ClientDataSet1.CommandText:='select f1,f2,f3,f4,f4,f6,f7,sum(f8) as f20,smu(f9) as f30,sum(f10) as f40 into list2 from list1 group by f4,f4,f6,f7;
  F_DM2.ClientDataSet1.Execute;
  F_DM2.ClientDataSet1.Open;
  F_DM2.ClientDataSet1.Refresh;
  end;
end.
结果出错:“list1.f1在选择列表中无效,因为该列既不包含在聚合函数中,也不包含在group by句子中。”

解决方案 »

  1.   

    group by 后面要加入 f1,f2,f3,f4,f4,f6,f7并且Into 后面最好用 #List2要不下次
    运行会出错,看来楼主对SQL语句不熟悉还要多加练习.
      

  2.   

    旺仔说的是,我对SQL语句不熟悉,以上语句都是参考过来的。
        我按旺仔的说法改了,但生成的list2跟list1的记录完全一样,根本没有累加,只是f8,f9,f10变成了f20,f30,f40而已。
        在'select f1,f2,f3,f4,f4,f6,f7,sum(f8) as f20,smu(f9) as f30,sum(f10) as f40 into list2 from list1 group by f1,f2,f3,f4,f4,f6,f7'中,我看不出我的累加条件:凡list1中,f4,f4,f6,f7四个字段相同的记录,f8,f9,f10都要累加。
        网友说:“group是分组,就是把有相同字段值的记录进行汇总,成一组”,所以我以为group by后面就是f4,f4,f6,f7四个字段相同的记录。
        以上是我没解决的问题以及我的困惑。请朋友继续点拨。谢谢!
      

  3.   

    我还是不明白你的意思,只是把你的SQL语句纠正过来.
    你试一下这条语句是不是你想要的.select f4,f5,f6,f7,sum(f8) as f20,smu(f9) as f30,sum(f10) as f40 into #list2 from list1 group f4,f5,f6,f7
      

  4.   

    以上还是不行,提示数据库中已存在名为#list2的对象。实际上并没有(我刷新了几次)。  
      我的意思是:表list1中,有f1  f2  f3  f4  f5  f6  f7  f8  f9  f10字段中,要求对凡是f4  f5  f6  f7四个字段相同的记录,就要合并它的f8  f9  f10字段。楼顶上的表看清楚中吗?
      

  5.   

    靠,无法与你勾通这 #list2是一个临时表如果库中存在也是你上次
    运行这条语句产生的.
    你可以用这条语句把这个表删除IF EXISTS (SELECT * FROM SYSOBJECTS WHERE [NAME]='#LIST1' AND TYPE='U')
     DROP TABLE #LIST
    不帮你了,自己找别的高手搞定了,还是多看些SQL方面的书吧,一些专业的术语都
    不知道怎么叫 合并应该叫求和.faint!!!!!!!!!!!!!!!!!!