这条sql语句哪里出错——在线守侯

loveness 2002-08-10 10:48:31
请帮我看看下面一段查询语句哪里出错,如果把bl_no字段去掉统计就正常,加入字段bl_no字段就出错,表(access)中确实有该字段,而且我要对该字段进行过滤呀,是不是delphi的统计查询不能怎么处理呀,那要如何处理?
代码如下:

procedure TFrmTotaIn.Button1Click(Sender: TObject);
var
sqlstr:string;
begin
with frmdatamod.TempQ do
begin
Close;
SQL.Clear;
SqlStr:=' select bl_no,sum(gp20),sum(hq20),sum(ot20),sum(el20), ';
SqlStr:=SQLStr+' sum(gp40),sum(hq40),sum(ot40),sum(el40) ';
SqlStr:=SQLStr+' from incont ';
SQL.Add(sqlstr);
open;
end;
end;

运行时错误提示:试图执行的查询中不包含作为合计函数一部分的特定表达式'bl_no'

还有:我的fastreport报表生成DELPHI可执行文件后,用户改了报表格式后,并且存盘(覆盖),但报表格式还是没变,谢谢
...全文
37 30 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzzworm 2002-08-13
  • 打赏
  • 举报
回复
以下经过SQL测试!可以成功!
select incort.bl_no,b.sgp20 from incort join (select sum(gp20) as sgp20,bl_no from incort group by bl_no) as b on b.bl_no=incort.bl_no

总之
select 旧表.唯一值,新表.合计值字段 from 旧表 join (select 合计(xxx) as 合计值字段,唯一值 from 旧表 group by 键值) as 新表 on 新表.键值=旧表.键值
Feelgood 2002-08-13
  • 打赏
  • 举报
回复
这条语句在SQL语法上是有问题的,很明显,SUM等函数的结果只会有一条记录,但偏偏又多了bl_no(它的查询结果并不确定),尽管该字段在该数据库中并无重复记录,建议可能的话换另一种方式
Feelgood 2002-08-13
  • 打赏
  • 举报
回复
这条语句在SQL语法上是有问题的,很明显,SUM等函数的结果只会有一条记录,但偏偏又多了bl_no,尽管该字段在该数据库中并无重复记录,建议可能的话换另一种方式
dupenf 2002-08-13
  • 打赏
  • 举报
回复
gz
yoisyois 2002-08-13
  • 打赏
  • 举报
回复
加上 as 试试吧
loveness 2002-08-13
  • 打赏
  • 举报
回复
to zzzworm(磕睡虫)
&^&^&)(*&(*^$%$##$@$#^()&_)*(_)((*^&^#$
$%#$&%^*(^(_*_(_)(*&^&^$^#(*&_)(_+)((&(^&$$#

晕!
倒!!
好复杂哟!!!
请问老兄在哪儿看到的
厉害,值得研究
Alexs 2002-08-12
  • 打赏
  • 举报
回复
我觉得你应该是统计bl_no相同的数据项吧,bl_no 应该不是唯一
试一下:select sum(**),sum(***)...where bl_no=(select bl_no from incont) group by bl_no
很奇怪!
jadesun 2002-08-12
  • 打赏
  • 举报
回复
是一个聚合函数的问题

写一个group by 子句就OK了
fwwxxjingling 2002-08-12
  • 打赏
  • 举报
回复
如果使用了sum等函数,则Select后列的字段不在sum等函数中,就必须在group by 子句中,这是Sql语法规定的.如果值为唯一的话,为什么不能用group by 呢?
shuixin13 2002-08-12
  • 打赏
  • 举报
回复
将表结构贴出来看看吧
loveness 2002-08-12
  • 打赏
  • 举报
回复
to zhhahuatian(华仔)
按照你的方法试了,还是不行
TKS!
keyz 2002-08-12
  • 打赏
  • 举报
回复
对于Delphi的SQL调用我不是很清楚,我只对SQL比较熟。

因为数据库中的日期存储方式各不相同,而Delphi中的日期其实是一个浮点数,所以我不知道你这样赋值会出现什么问题。如果你可以使用其他条件查询(非日期型的),说明是日期表示的问题。具体的方法可能需要查数据库的日期方式,你可以试试使用字符串,比如'2002-1-1'。
zhhahuatian 2002-08-12
  • 打赏
  • 举报
回复
楼上的错了,你把where 条件语句加错位制了
SqlStr:=SQLStr+' sum(gp40),sum(hq40),sum(ot40),sum(el40) ';
SqlStr:=SQLStr+' from incont where a.bill_date between :date1 and :date2) b ';
你再试试看
zy61 2002-08-12
  • 打赏
  • 举报
回复
看不懂你想干什么。
但是如果使用了sum等函数,则Select后列的字段不在sum等函数中,就必须在group by 子句中,这是Sql语法规定的,且在我看来也很合理,只是我不清楚你要用这个sql语句表达什么,所以不知道该怎么写,但是你给的句子在语法上就是错的。
jcpnj 2002-08-12
  • 打赏
  • 举报
回复
老兄,你想做什么那?
select bl_no,sum(gp20),sum(hq20),sum(ot20),sum(el20),
sum(gp40),sum(hq40),sum(ot40),sum(el40)
from incont
这样的sql 一定要group by bl_no
你的bl_no是个值吗?
作为param 不就行了,象这样
select :bl_no,sum(gp20),sum(hq20),sum(ot20),sum(el20),
sum(gp40),sum(hq40),sum(ot40),sum(el40)
from incont
group by :bl_no
然后传paramByName('bl_no').as... := ???
或者再套上一层,象这样
select bl_no a.*
from
(
select sum(gp20) sum_gp20,
sum(hq20) sum_hq20,
sum(ot20) sum_ot20,
sum(el20) sum_el20,
sum(gp40) sum_gp40,
sum(hq40) sum_hq40,
sum(ot40) sum_ot40,
sum(el40) sum_el40
from incont
) a
CHENGXB 2002-08-12
  • 打赏
  • 举报
回复
loveness(天若有情天亦老) :
我觉的你的的想法有些问题,
如果按时间段查询,则统计值只有一条记录,而bl_no有多个值,它们不能放在一个SELECT 里,除非让统计值重复,可是你在界面上又怎么显示呢?
CHENGXB 2002-08-12
  • 打赏
  • 举报
回复
对zhhahuatian(华仔) 的做了个小小的修改:
SqlStr:=SQLStr+' sum(gp40),sum(hq40),sum(ot40),sum(el40) ';
SqlStr:=SQLStr+' from incont where bill_date between :date1
~~~~
把a.去掉
and :date2) b ';
cfag 2002-08-12
  • 打赏
  • 举报
回复
单独的字段不能和求和字段一起查询
实在不行的话,用两个query分别查出
这样可否实现你的功能?
keyz 2002-08-11
  • 打赏
  • 举报
回复
统计表达式不能与非统计表达式出现在一起,除非非统计表达式出现在Group by中。这是Sql语法所决定的,无论非统计表示式是否是关键字。

你这个情况可以用这样的SQL语句表示:
select a.bl_no,b.* from incont a,
(select sum(gp20),.... from incont) b;

或者
select bl_no, (select sum(gp20) from incont) sum_gp20,.....
from incont

取决于你的数据是否支持第一种写法。
loveness 2002-08-11
  • 打赏
  • 举报
回复
to keyz(keyz)
老兄:按照你的方法我已成功修改的原程序,但随之而来的问题是,查询条件不起作用,datetimepicker1.DateTime 及datetimepicker2.DateTime均有值, 错误提示:tempQ未发现参数'date1' 原代码如下,请指教!!!
with frmdatamod.TempQ do
begin
Close;
SQL.Clear;
SqlStr:=' select a.bl_no,a.bill_date,a.oper_dock,';
SqlStr:=SQLStr+' b.* from incont a, (select sum(gp20),';
SqlStr:=SQLStr+'sum(hq20),sum(ot20),sum(el20), ';
SqlStr:=SQLStr+' sum(gp40),sum(hq40),sum(ot40),sum(el40) ';
SqlStr:=SQLStr+' from incont ) b ';
SqlStr:=SQLStr+' where a.bill_date between :date1 and :date2';
Parameters.ParamByName('date1').Value:=datetimepicker1.DateTime ;
Parameters.ParamByName('date2').Value:=datetimepicker2.DateTime ;
SQL.Add(sqlstr);
Open;
end;
加载更多回复(10)

5,931

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧