要实现这种功能的sql代码如何写?我写的为何总是出错? 高手们指点一二!(50分)

  • 主题发起人 libaoliang
  • 开始时间
L

libaoliang

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi5.0+BDE+paradox开发的系统中,a1,a2,a3 分别是cpk.db 的三个数据型字段,
xm 是字符型的姓名字段,其中a1,a2 数量可以合计,a3是指标数,不能合计,现在要把
a1,a2都按照xm字段合计起来并和a3(指标)一起添加到一个新表中,下面的代码总是出错,
请问具体应该如何写?谢谢赐教!
..
with query1 do
begin
close;
sql.clear;
sql.add('insert into new.db(xm,a1,a2,a3) select xm,sum(a1),sum(a2),a3 from cpk group by xm');
execsql;
end;
...
这样写代码总是出错,要求所有字段都要按照xm分组什么的,请问应该如何写这段代码?

 
select xm,sum(a1),sum(a2),a3 from cpk group by xm
此语句有问题,a3不能按照xm分组,你的目的是什么,我不清楚,
但如下语句,语法上是正确的,不知道是否达到你的要求。
(最后加一个 a3)

sql.add('insert into new.db(xm,a1,a2,a3) select xm,sum(a1),sum(a2),a3 from cpk group by xm,a3');
 
我的目的是:
将a1,a2 按照xm 合计起来并插入到一个新表中,a3 作为一种指标数据,
就象价格一样是不能进行合计的,同一种物资的a3值都一样,不同物资的a3不一样,
此处的a3 理解为单价更好,在新表中,就可以看到每个人每种物资的销售情况了,
而把a3 也加进来,是要达到参考作用,同时可以根据每种物资的汇总情况得出一个
结果,把该结果与a3,也就是每种物资的指标进行比较,可以评价每个人员的工作
情况,并依此进行奖惩。




 
在sql中,如果有group by ,则每一项都必须要按照后面的条件进行分组吗?
如果有的不以该条件分组或者不要分组,代码应该怎么写?

 
select xm,sum(a1),sum(a2),a3 from cpk group by xm
该句有问题!!
要么对a3聚合(sum/avg/max等),要么a3出现在group by里。
这是常识。
 
a3 出现在group by 里也不对,
至少你的例子我试过还是出问题,
你看这样一来行吧:
insert into new.db(xm,a1,a2,a3) select a.xm,sum(a.a1),sum(a.a2),b.a3 from
cpk a,cpkk b group by a.xm where a.xm=b.xm
其中cpkk.db中有a3字段。

 
或者 select xm,sum(a1),sum(a2),max(a3) from cpk group by xm
这样可以吗?
 
to libaoliang:

你所说的问题是一个分组概念错误的问题。
在Select 列表中的元素,如果进行了分组,而你又进行了求和(只有一个值),
则字段查询结果只能以唯一的结果出现,
在你所列的元素中,字段a3不能这样书写,因为它不唯一,它有多个值,如若有条记录,
则就有3个值, 为了使它唯一(对a3聚合),
可以这样:
将 a3 改成 first(a3),last(a3),or min(a3),max(a3);--->
sql.add('insert into new.db(xm,a1,a2,a3) select xm,sum(a1),sum(a2),first(a3) from cpk group by xm');

即只取该字段的一个值。
 
pcc_mmzl:
如果你的代码能够通过,
等我攒够分数再给你增加100!
 
多人接受答案了。
 
顶部