你用的左连接,是不是要考虑一下为字段为空的情况?
xamo,eamo分别是哪个表的字段?
改成sum(isnull(xamo,0))和sum(isnull(eamo,0))试试?

解决方案 »

  1.   

    icevi(按钮工厂):
    你的意思是让我检查一下xamo,eamo两个字段是否存在null的情况吧?
    我看过的,没有这种情况。
    xamo,eamo分别属于两个不同的表,我是想根据第三张表的一个字段对这两个字段分组求和,但是如果只关联两张表,(gdsf和xs0106)得出的SUM()是正确的,如果关联三张表(gdsf,xs0106,e0106)得出的第二个SUM()的值就不对了,这是什么原因呢?
      

  2.   

    如果表xs0106和表e0106是一对一的情况,那应该不可能出现这个情况。
    如果表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;
      

  3.   

    不是本身这两个字段是不是有NULL,而是用左连接后,表一中有记录,表二中无对应记录,表二中的字段就会为NULL,用SUM对NULL求和是会有错的。
      

  4.   

    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;
      

  5.   

    hehe,so slow
    learn from icevi
      

  6.   

    我认为我的是对的
    考虑下面两个表
    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
      

  7.   

    各位的意思是说:对于GNO关键字,表一中有记录,而表二没有记录,求和就会有问题。
    那么为什么我下面这句得出的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;
      

  8.   

    在GDSF表中有的记录,在XS0106中并不全有,属于一对多的关系
    这不是一对多
    你不生声错误的原因是因为:
    在GDSF表中的一条记录,在XS0106表中没有多条记录对应他。下面的情况就,TABLE1和table2是一对多的情况 或table2和TABLE1是多对一的情况
    表table1
    Table1ID  Amount 
    1          10
    表table2
    Table1ID  Table2ID  
    1          1
    1          2
      

  9.   

    各位的意思是说:对于GNO关键字,表一中有记录,而表二没有记录,求和就会有问题。
    不是这个意思,应该是下面的意思
    表一中有一条记录,在表二有多条记录对应这条记录,求和就会有问题。
      

  10.   

    blp(★★★),请看:
    这句:
    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表中就有多条记录与之对应,和您所说的情况相符,但是,上面的语句执行后,得出的结果是正确的!
        这是为何呢?
      

  11.   

    如果gdsf中有,而xs0106中没有,就会有问题?
    有这种可能吗?(在e0106中)下班了,回去继续关注!
      

  12.   

    那这是由于你的求和,是在一对多的多那个表上,请仔细区别下面的不同
    第一种情况结果是错误的。
    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  正确你两个表关联时属于第二中情况,所以正确
    你三个表关联时,其中第二个表和第三个表的关系,就变成了第一中情况。所以错误。
      

  13.   

    blp(★★★):
    我通过下面这条语句证明您说的是正确的:
    select gdsf.gno,sum(gdsf.gramo) as mgramo
    from gdsf left join xs0106
    on gdsf.gno=xs0106.gno
    group by gdsf.gno;
    您的意思就是说:当出现一对多的情况时,如果对一的表求和,得出的结果就是错误的,而对多的表求和就没问题,是这样吧?
    但是,您前面的那条语句我怎么不能执行呢?
    我的问题还是没解决,您费心了,多谢!
      

  14.   

    我想了一下,通过view应该能够做到只不过要分两步走了,是不是麻烦了一点儿?!
    各位大虾有没有高招呢?
    期待!!!!!!!
      

  15.   

    这个问题的提法有问题
    你不如把你的表结构,你需要的结果写清楚,这样大家就会看清楚是不是需要左连接,为什么SUM()的结果不同,你说的SUM()结果偏大,往往是由于查询条件的问题,要看出查询条件的问题,至少应该明白表结构.
      

  16.   

    sorry,我从头详细说明一下我现在的问题:
    我用到三个table:1.gdsf:当前商品库存表,2.xs0106:某月份销售明细表,3.e0106:某月份进货明细表,在三个表中几个名字相同含义一样的字段:gno:商品代码,gnam:商品名称。在表xs0106中xamo字段是销售数量,在表e0106中eamo字段是进货数量。
       我其实就是想做一个进销存统计,原本我是用PB的datawin用的,发现不行,就用SQL语句写了,结果…………:(
      

  17.   

    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.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;
    请问:这两句的结果有什么不同?
      

  18.   

    问一个问题:
    在xs0106表中,一个GNO会重复还是不会重复?若是会重复,肯定用上面的语句统计会出问题,这样会导致e0106的记录重复。
      

  19.   

    TO:icevi(按钮工厂)
    哦,说明一下,我是在一个很早的系统产生的表的基础上作统计的,在这个系统里,它没有设置单独的商品代码表,它是把gdsf表作为商品代码表在用的。
    在xs0106表中,GNO肯定有重复的呀,因为XS0106是商品销售明细表呀!问题出在哪儿呢?
    TO:superjj2002()
    你的两条语句,SUM()得到的值是一样的,MEAMO都有问题,不同的是,前者得出的记录要多,而后者得出的记录少,因为后者中你把在xs0106和e0106中对应GNO字段没有的记录去掉了。