求一个跨表求和的sql(100)

  • 主题发起人 主题发起人 sherlockye
  • 开始时间 开始时间
S

sherlockye

Unregistered / Unconfirmed
GUEST, unregistred user!
表 A 字段 : 户名 消量表 B 字段 : 户名 卡名 表 C 字段 : 卡名 消量表A中一个户名可以对应表B中多个卡,表C是卡的消费明细,现需要对每户的消费求和并更新到A表,该如何写sql呢?我写的是update A set A.消量=sum(C.消量) from A,B,C where A.户名=B.户名 and B.卡名=C.卡名结果报错为试图执行的查询中包含作为合计函数一部分的特定表达式‘A.消量’PS:因为数据量很大,使用非sql的方法会很慢很慢,所以就只能sql了。
 
update aset a.消量=x.消量 from a ,(select 户名,sum(消量) as 消量from (select b.户名,b.卡名,c.消量from B,Cwhere b.卡名=c.卡名 ) sgroup by 户名)x where a.户名 =x.户名
 
update aset a.消量=x.消量from a(nolock) inner join (select b.户名,sum(c.消量) as 消量 from b (nolock) inner join c (nolock) on b.卡名=c.卡名 group by b.户名 ) x on a.户名=x.户名
 
语法错误,操作符丢失,在查询表达式'x.销量 from a楼上两位的sql都报这个错,是我的ADOQuery哪个地方用错了吗?
 
我的在资源管理器调试通过~~~2楼的我也测试通过了~~~只能说你的代码有问题~~用showmessage(ADOQuery.sql.text);看看语句是否和我们的一样?
 
确实找不到原因,只能麻烦两位再帮我看看我到底哪里写错了我这边实际的表情况:表     字段1    字段2客户   客户编号    合计消量卡信息  客户编号    帐号消费   帐号      数量关系还是一样, 客户 表中的 客户编号 对应 卡信息 表中的多个 帐号 ,现要对每个客户的 数量 求和,写入 合计销量 字段。2楼的我这边写下来是这样:update 客户 set 客户.周均销量柴油=x.消量 from 客户 ,(select 客户编号,sum(数量) as 消量from (select 卡信息.客户编号,卡信息.卡号,消费.消量from 卡信息,消费where 卡信息.帐号=消费.帐号 ) sgroup by 帐号) x where 客户.客户编号 =x.客户编号3楼的我写下来是:update 客户 set 客户.周均消费柴油=x.消量 from 客户(nolock) inner join (select 卡信息.客户编号,sum(消费.数量) as 消量 from 卡信息 (nolock) inner join 消费 (nolock) on 卡信息.帐号=消费.帐号 group by 卡信息.客户编号) x on 客户.客户编号=x.客户编号无论哪个,报的错误都一样,都是在 x.消费 from 客户 这个地方操作符丢失。难道是ADOQuery不支持 update from.......实在是麻烦大家了,我愿意追加积分。顺便问一下怎么追加呀,没找到地方.....
 
update 客户 set 客户.周均销量柴油=x.消量 from 客户 ,(select 客户编号,sum(数量) as 消量from (select 卡信息.客户编号,卡信息.卡号,消费.消量from 卡信息,消费where 卡信息.帐号=消费.帐号 ) sgroup by 帐号) [red]as [/red]x where 客户.客户编号 =x.客户编号这样试一下~~
 
一个小错误,“group by 帐号”应该改为“group by 客户编号”。不过做了这个调整之后仍然报相同的错误。我做了这样一个测试,把update改成了select,用来显示求和结果,其他不变,如下:select 客户.客户名称,x.消量from 客户,(select 客户编号,sum(数量) as 消量 from (select 卡信息.客户编号,卡信息.卡号,消费.数量 from 卡信息,消费 where 卡信息.帐号=消费.帐号 ) group by 客户编号) as xwhere 客户.客户编号 =x.客户编号这个测试通过了,但是update就是过不去。另外,我的库是Access。
 
终于发现了问题的症结,Access的语法不一样,它没有update from,而是update T1,T2set T1.a=T2.awhere T1.b=T2.b但是,access的这个语法要求update后面跟的都是可更新的表,跟一个查询貌似不行,太NC了。谁知道access的update后面跟查询该如何写吗?
 
最终找到了一个叫做dsum的域函数搞定了这个问题,同时也很伤心的发现,这个sql的速度和我用fieldbyname的效率差不多......
 
多人接受答案了。
 
建表:tab_1: name perchasewj 1ww 2tab_2:name cardwj aawj bbwj ccww ddww eeww fftab_3card perchaseaa 11bb 22cc 33dd 44ff 55要将select a.name,sum(b.perchase) as perchase from tab_2 a left join tab_3 b on a.card=b.card group by a.name结果name perchasewj 66ww 165更新到tab_1中。最终:update c set c.perchase=d.perchase from tab_1 c left join (select a.name,sum(b.perchase) as perchase from tab_2 a left join tab_3 b on a.card=b.card group by a.name) d on c.name = d.name给分吧!!!!!!!!!!!!!!!!!!11
 
楼上,你写的东西在access里面是执行不了的,因为access的update不能使用复合查询的结果,只能dsum(),我估计做个临时表会比较快
 
用了个临时表,快了无数倍,于是把dsum扔到一边去了这个故事教育我们,一个sql语句完不成的事情,就不要强行用一个sql来干......太失败了
 
后退
顶部