你用的左连接,是不是要考虑一下为字段为空的情况?
xamo,eamo分别是哪个表的字段?
改成sum(isnull(xamo,0))和sum(isnull(eamo,0))试试?
xamo,eamo分别是哪个表的字段?
改成sum(isnull(xamo,0))和sum(isnull(eamo,0))试试?
解决方案 »
- 分别在二张表里的数据,表之间没有主外关系,如果A 表有十条数据,B也应有十条记录,没有的置为空,如果A表有五条记录,B表有十条记录,则A表中余下的记录置为空
- GUID是什么,有什么用处?
- Join 查询
- 求助:单表查询同名,并更新
- 求一简单select语句
- 如何在一个表中插入多条记录
- 不同的记录数量合并,相同的记录数量取其一 SQL语句怎么写
- SQL没有问题ACCESS出现“该特定字段 '[User]' 可以参考 SQL 语句中 FROM 子句列表中的多个表。 ”
- 有关sql语句中时间格式的转换问题,40分送上
- 如何把表的名字作为变量来创建存储过程?
- 各位爷,sql server2000哪有下载地?
- 原来装了8。0。5,现在把他卸载,安装8。17,却安装不上/??奇怪
你的意思是让我检查一下xamo,eamo两个字段是否存在null的情况吧?
我看过的,没有这种情况。
xamo,eamo分别属于两个不同的表,我是想根据第三张表的一个字段对这两个字段分组求和,但是如果只关联两张表,(gdsf和xs0106)得出的SUM()是正确的,如果关联三张表(gdsf,xs0106,e0106)得出的第二个SUM()的值就不对了,这是什么原因呢?
如果表xs0106和表e0106是一对多的情况 那会出现这个情况。
你应该这样写
select gdsf.gno,sum(xamo) as mxamo,sum(eamo) as meamo
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
left join (select distinct gno as t_gno from e0160) t_e0106
on t_e0106.t_gno=gdsf.gno
group by gdsf.gno;
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
left join e0106
on e0106.gno=gdsf.gno
where xs0106.gno is not null and e0106.gno is not null
group by gdsf.gno;
learn from icevi
考虑下面两个表
table1
Table1ID Amount
1 10
table2
Table1ID Table2ID
1 1
1 2
SELECT TABLE1.Table1ID,SUM(Amount) FROM TABLE1 group by table1.table1ID
结果为 1 10
SELECT TABLE1.Table1ID,SUM(Amount) FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.TABLE1ID=TABLE2.TABLE1ID group by table1.table1ID
结果为 1 20
那么为什么我下面这句得出的MXAMO都是对的呢?
同样,对应于GNO字段,在GDSF表中有的记录,在XS0106中并不全有,属于一对多的关系,这样的结果是什么呢?
select gdsf.gno,sum(xs0106.xamo) as mxamo
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
group by gdsf.gno;
这不是一对多
你不生声错误的原因是因为:
在GDSF表中的一条记录,在XS0106表中没有多条记录对应他。下面的情况就,TABLE1和table2是一对多的情况 或table2和TABLE1是多对一的情况
表table1
Table1ID Amount
1 10
表table2
Table1ID Table2ID
1 1
1 2
不是这个意思,应该是下面的意思
表一中有一条记录,在表二有多条记录对应这条记录,求和就会有问题。
这句:
select gdsf.gno,sum(xs0106.xamo) as mxamo
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
group by gdsf.gno;
gdsf和xs0106两个表也存在这样的情况,gdsf.gno字段中gdsf表中是唯一的,而xs0106.gno字段中xs0106中并不是唯一的,也就是说在gdsf表中有一条记录,在xs0106表中就有多条记录与之对应,和您所说的情况相符,但是,上面的语句执行后,得出的结果是正确的!
这是为何呢?
有这种可能吗?(在e0106中)下班了,回去继续关注!
第一种情况结果是错误的。
table1
Table1ID Amount
1 10
table2
Table1ID Table2ID
1 1
1 2
SELECT TABLE1.Table1ID,SUM(Amount) FROM TABLE1 group by table1.table1ID
结果为 1 10SELECT TABLE1.Table1ID,SUM(Amount) FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.TABLE1ID=TABLE2.TABLE1ID group by table1.table1ID
结果为 1 20 错误
第二种情况结果是正确的。
表table1
Table1ID
1
表table2
Table1ID Table2ID Amount
1 1 10
1 2 20
SELECT TABLE1.Table1ID,SUM(Amount) FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.TABLE1ID=TABLE2.TABLE1ID group by table1.table1ID
结果为 1 30 正确你两个表关联时属于第二中情况,所以正确
你三个表关联时,其中第二个表和第三个表的关系,就变成了第一中情况。所以错误。
我通过下面这条语句证明您说的是正确的:
select gdsf.gno,sum(gdsf.gramo) as mgramo
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
group by gdsf.gno;
您的意思就是说:当出现一对多的情况时,如果对一的表求和,得出的结果就是错误的,而对多的表求和就没问题,是这样吧?
但是,您前面的那条语句我怎么不能执行呢?
我的问题还是没解决,您费心了,多谢!
各位大虾有没有高招呢?
期待!!!!!!!
你不如把你的表结构,你需要的结果写清楚,这样大家就会看清楚是不是需要左连接,为什么SUM()的结果不同,你说的SUM()结果偏大,往往是由于查询条件的问题,要看出查询条件的问题,至少应该明白表结构.
我用到三个table:1.gdsf:当前商品库存表,2.xs0106:某月份销售明细表,3.e0106:某月份进货明细表,在三个表中几个名字相同含义一样的字段:gno:商品代码,gnam:商品名称。在表xs0106中xamo字段是销售数量,在表e0106中eamo字段是进货数量。
我其实就是想做一个进销存统计,原本我是用PB的datawin用的,发现不行,就用SQL语句写了,结果…………:(
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
left join e0106
on e0106.gno=gdsf.gnogroup by gdsf.gno;select gdsf.gno,sum(xamo) as mxamo,sum(eamo) as meamo
from gdsf left join xs0106
on gdsf.gno=xs0106.gno
left join e0106
on e0106.gno=gdsf.gno
where xs0106.gno is not null and e0106.gno is not null
group by gdsf.gno;
请问:这两句的结果有什么不同?
在xs0106表中,一个GNO会重复还是不会重复?若是会重复,肯定用上面的语句统计会出问题,这样会导致e0106的记录重复。
哦,说明一下,我是在一个很早的系统产生的表的基础上作统计的,在这个系统里,它没有设置单独的商品代码表,它是把gdsf表作为商品代码表在用的。
在xs0106表中,GNO肯定有重复的呀,因为XS0106是商品销售明细表呀!问题出在哪儿呢?
TO:superjj2002()
你的两条语句,SUM()得到的值是一样的,MEAMO都有问题,不同的是,前者得出的记录要多,而后者得出的记录少,因为后者中你把在xs0106和e0106中对应GNO字段没有的记录去掉了。