回 帖 发 新 帖 刷新版面

主题:[请教] 以表1中编号为关键字,统计表2中相同编号的数量的SQL语句如何写?

表1中有字段BH(编号),以该BH为关键字,统计表2中相同编号的数量,也就是对表2中的SL求和,再把求和结果写入表1的N_SL。
SQL语句如应何写?十分感谢!

回复列表 (共33个回复)

11 楼

[quote]你知道你上面那句有啥影响么?。。。
数据一多 你全部UPDATE?对UPDATE不过滤 反而对UPDATA的结果过滤?
倘若原来那表1 的数量原来就有值 ,且某个BH不存在于表2 ,你直接也把他UPDATE为0?
[/quote]
说得太对了,那就再修正一下:
update 表1 set n_sl = (select sum(n_sl) from 表2 where bh = 表1.bh);
where bh in (select bh from 表2)

12 楼

。。。。。。

13 楼

很明显  你的之前写的效果也是一样。。。
你自己UPDATE过就知道。。。我直接写的 没测试
语句直接是MS-SQL格式写的 VFP中 自己加分号

你说的错是就 b 在应该在子句后面吧? 这点确实是错了,改下如下
SQL语句正常工作中是求精简,但清晰与效率应该是前提..
个人习惯用连接(join)也是为了以后维护,条件看起来清晰点..
update 表一 set a.N_SL=b.数量
 from 表一 a inner join (select BH,sum(数量) as 数量 from 表二 group by BH) b on a.BH=b.BH

你觉得你自己写的语句是正常update? 
正常程序 你那样的update自己会导致什么结果 你应该很清楚
表一                     表二
物品  数量            物品  数量  
A      0               A     10
B      0               A     20
C      0               B     30
如果表是这样 你的语句执行完全没错
那如果这样呢?

表一                     表二
物品  数量            物品  数量  
A      1               A     10
B      1               A     20
C      1               B     30
那你update后 C就变成0?A变成30?B变成30?
我说的也是求和。。
换句话说..如果表一有几W条记录 而表二只有那么几百条?
如果不过滤更新记录?A表所以记录都更新,那你UPDATE 几W条记录?

14 楼

sorry,受前面答题内容sum()的影响,是我看错题了(‘统计’而不是‘求和’),应该用count()而不是sum(),我再重来。。。

15 楼

CREATE CURSOR 表2 ( bh i, sl i)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)

CREATE CURSOR 表1 ( bh i, n_sl i)
INSERT INTO 表1 VALUES ( 1, 0)
INSERT INTO 表1 VALUES ( 2, 0)
INSERT INTO 表1 VALUES ( 3, 0)
INSERT INTO 表1 VALUES ( 4, 0)
INSERT INTO 表1 VALUES ( 5, 0)
INSERT INTO 表1 VALUES ( 7, 1)


UPDATE 表1 SET N_SL = a.sl from (SELECT bh, count(*) sl FROM 表2 a GROUP BY a.bh) a WHERE 表1.bh=a.bh
brow

16 楼

楼上二位兄弟好:
    更正一下,本人目的是求和,写成了统计。过去统称统计习惯,没表达的那么严格,抱歉!

17 楼

‘统计表2中相同编号的数量’中的‘数量’改成‘个数’——这个大家就不会理解错了。一个错后面全错——教训,以为前面的人理解的对就没好好审题

18 楼

怎么又变成‘求和’了?
能重写下你的题吗?(求和的字段是什么)

19 楼

两个都写上:
CREATE CURSOR 表2 ( bh i, sl i)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
INSERT INTO 表2 VALUES ( 1, 20)
INSERT INTO 表2 VALUES ( 2, 10)
INSERT INTO 表2 VALUES ( 3, 30)
INSERT INTO 表2 VALUES ( 4, 40)
INSERT INTO 表2 VALUES ( 5, 50)
INSERT INTO 表2 VALUES ( 6, 60)
INSERT INTO 表2 VALUES ( 8, 60)

CREATE CURSOR 表1 ( bh i, n_sl i)
INSERT INTO 表1 VALUES ( 1, 0)
INSERT INTO 表1 VALUES ( 2, 0)
INSERT INTO 表1 VALUES ( 3, 0)
INSERT INTO 表1 VALUES ( 4, 0)
INSERT INTO 表1 VALUES ( 5, 0)
INSERT INTO 表1 VALUES ( 7, 1)


UPDATE 表1 SET N_SL = a.sl from (SELECT bh, count(*) sl FROM 表2 a GROUP BY a.bh) a WHERE 表1.bh=a.bh
brow
UPDATE 表1 SET N_SL = a.sl from (SELECT bh, sum(sl) sl FROM 表2 a GROUP BY a.bh) a WHERE 表1.bh=a.bh
brow

20 楼

[quote]怎么又变成‘求和’了?
能重写下你的题吗?(求和的字段是什么)[/quote]
抱歉!又在原题中加了一句“也就是对表2中的SL求和”,这回能好理解一些了吧?

我来回复

您尚未登录,请登录后再回复。点此登录或注册