select a.名称,到货数量=sum(b.数量),销售数量=sum(c.数量) from 库存表 a
left join 到货表 b on a.名称=b.名称
left join 销售表 c on a.名称=c.名称
group by  a.名称

解决方案 »

  1.   

    select a.名称,总库存=sum(b.数量)-sum(c.数量) from 库存表 a
    left join 到货表 b on a.名称=b.名称
    left join 销售表 c on a.名称=c.名称
    group by  a.名称
      

  2.   

    select a.名称,a.部门,总库存=sum(b.数量)-sum(c.数量) from 库存表 a
    left join 到货表 b on a.名称=b.名称
    left join 销售表 c on a.名称=c.名称
    group by  a.名称,a.部门
      

  3.   

    回复人: lsxaa(小李铅笔刀) ( ) 信誉:100 
    就是因为数据不正确才要重新计算库存,有些数据可能已经丢失
      

  4.   

    因为每个表的‘数量’字段都不为空,也没有默认值,所以当没有销售,或没有到货的时候SUM(销售)的值为NULL,所以无法计算。
      

  5.   

    这样试试
    select COALESCE(a.名称,b.名称,c.名称) as 名称,
           COALESCE(a.部门,b.部门,c.部门) as 部门,
           总库存=sum(isnull(b.数量,0))-sum(isnull(c.数量,0)) 
    from 库存表 a
    full join 到货表 b on a.名称=b.名称
    full join 销售表 c on a.名称=c.名称
    group by  COALESCE(a.名称,b.名称,c.名称),COALESCE(a.部门,b.部门,c.部门)
      

  6.   

    回复人: hdhai9451(Water Space--海洋空間) ( )因为库存表里的‘名称’字段不是唯一。他对应的是各部门的总库存,所以统计有问题
      

  7.   

    lsxaa(小李铅笔刀) 
    的行吗?
      

  8.   

    回复人: lsxaa(小李铅笔刀) ( ) 信誉:100 为NULL的问题是解决了,可是这样查会出现一对多,数量都翻倍了,库存表(一个名称按部门分总库存)、到货表(一个名称又多次到货)、销售表(一个名称又多次销售) 的名称都不是唯一的,
      

  9.   

    select COALESCE(a.名称,b.名称,c.名称) as 名称,
           COALESCE(a.部门,b.部门,c.部门) as 部门,
           总库存=sum(isnull(b.数量,0))-sum(isnull(c.数量,0)) 
    from 库存表 a
    full join 到货表 b on a.名称=b.名称 and a.部门=b.部门   --加上部门
    full join 销售表 c on a.名称=c.名称 and a.部门=c.部门    --加上部门
    group by  COALESCE(a.名称,b.名称,c.名称),COALESCE(a.部门,b.部门,c.部门)
      

  10.   

    回复人: lsxaa(小李铅笔刀) ( ) 信誉:100 
    谢谢你的回复可是数量翻倍的问题依然没有解决呀如果
    到货表
    名称  数量  部门
    001    50   33
    001    20   33
    002    10   30 销售表
    名称  数量  部门
    001   1     33
    001   2      33
    002    10   30 
    您的语句查出来就会重复叠加了。
      

  11.   

    你把三个表的数量字段的默认值改为0。
    (如果有默认值先删除再增加)
    alter table 库存表 add constraint default_sum default 0 for 库存
    alter table 到货表 add constraint default_sum1 default 0 for 数量
    alter table 销售表 add constraint default_sum2 default 0 for 数量
    然后再用下面的语句select a.名称,库存=sum(b.数量)-sum(c.数量) from 库存表 a
    left join 到货表 b on a.名称=b.名称
    left join 销售表 c on a.名称=c.名称
    group by  a.名称,a.部门
      

  12.   

    create table 到货表(名称 varchar(10), 数量 int,部门 varchar(2))
    insert into 到货表
    select '001',50,'33'  union all
    select '001',20,'33'  union all
    select '002',10,'30' create table 销售表(名称 varchar(10), 数量 int,部门 varchar(2))
    insert into 销售表
    select '001',1,'33' union all
    select '001',2,'33'  union all
    select '002',0,'30'create table 库存表(名称 varchar(10),库存 int,部门 varchar(2))
    insert into 库存表
    select '001',0,'33' select a.名称,a.部门,sum(a.数量) from (
    select isnull(a.名称,b.名称) as 名称,isnull(a.部门,b.部门) as 部门
           ,-sum(isnuLL(b.数量,0)) as 数量
    from 库存表 a full join  销售表 b on a.名称=b.名称 and a.部门=b.部门 
    group by isnull(a.名称,b.名称),isnull(a.部门,b.部门)
    union all
    select isnull(a.名称,b.名称) as 名称,isnull(a.部门,b.部门) as 部门
           ,sum(isnuLL(b.数量,0)) as 数量
    from 库存表 a full join  到货表 b on a.名称=b.名称 and a.部门=b.部门 
    group by isnull(a.名称,b.名称),isnull(a.部门,b.部门)
    ) a
    group by a.名称,a.部门
      

  13.   

    整理一下...select a.名称,a.部门,sum(a.数量) as 数量
    from ( select isnull(a.名称,b.名称) as 名称,isnull(a.部门,b.部门) as 部门
                  ,-sum(isnuLL(b.数量,0)) as 数量
           from 库存表 a full join  销售表 b on a.名称=b.名称 and a.部门=b.部门 
           group by isnull(a.名称,b.名称),isnull(a.部门,b.部门)
           union all
           select isnull(a.名称,b.名称) as 名称,isnull(a.部门,b.部门) as 部门
                  ,sum(isnuLL(b.数量,0)) as 数量
           from 库存表 a full join  到货表 b on a.名称=b.名称 and a.部门=b.部门 
           group by isnull(a.名称,b.名称),isnull(a.部门,b.部门)
         ) a
    group by a.名称,a.部门
    order by 部门,姓名
      

  14.   

    谢谢lsxaa(小李铅笔刀) 兄弟
    这次是对了,可是好象很慢的样子
    那如果我在要是把损益表、赠送表、批发表(结构都节本差不多)全连起来一起算那不是更慢了。
      

  15.   

    晕倒,那么多表呢?那就用临时表,注意每个表要这样写
    select isnull(a.名称,b.名称) as 名称,isnull(a.部门,b.部门) as 部门
                  ,-sum(isnuLL(b.数量,0)) as 数量
    into #t1 --插入临时表       
    from 库存表 a full join  销售表 b on a.名称=b.名称 and a.部门=b.部门 
    group by isnull(a.名称,b.名称),isnull(a.部门,b.部门)然后再对各个临时表作操作....
      

  16.   

    我们可以把问题拆开来:
    第一步:
    //到货表中数量汇总,按名称,部门(其中有一部分名称、部门可能销售表中没有,部分相同)
    //这条语句生成的结果集假定为table1表
    select 名称,部门,sum(数量) as 数量 from 到货表 group by 名称,部门
      
    //销售表中数量汇总,按名称,部门(其中有一部分名称、部门可能到货表中没有,部分相同)
    //这条语句生成的结果集假定为table2表
    select 名称,部门,sum(数量) as 数量 from 销售表 group by 名称,部门  第二步:
    select a.名称,a.部门,数量=a.数量-b.数量 from table1 a
    left join table2 b
    on
    a.名称=b.名称,a.部门=b.部门       //语句到这里取出两者相同的部分
    union
    select 名称,部门,数量 from table1 where 名称 not in(select distinct 名称 from table2) and 部门 not in(select distinct 部门 from table2)    //语句到这里取出table1中不同的部分
    union
    select 名称,部门,数量 from table2 where 名称 not in(select distinct 名称 from table1) and 部门 not in(select distinct 部门 from table1)    //语句到这里取出table1中不同的部分//到这里已经取出两个表中所有按名称、部门分类的总数量。把它作为table3(之前,应该把数量的默认值设为0)但是库存表中可能有些已经有库存、有些库存为0,还有可能有一些名称、部门是以上两个表中所没有的,所以还要加上这一部分:
    select c.名称,c.部门,数量=c.数量+d.数量 from table3 a
    left join 库存表 d
    on
    c.名称=d.名称,c.部门=d.部门       //语句到这里取出两者相同的部分
    union
    select 名称,部门,数量 from 库存表 where 名称 not in(select distinct 名称 from table3) and 部门 not in(select distinct 部门 from table3)    //语句到这里取出table1中不同的部分
    //这里应该是库存的总数量……
    //具体语句写法上可能有点问题,照搬肯定不行,大体思路应该正确
      

  17.   

    第二步:
    union
    select 名称,部门,数量 from table2 where 名称 not in(select distinct 名称 from table1) and 部门 not in(select distinct 部门 from table1)    //语句到这里取出table2中不同的部分//上面这一句应该不要,因为它是销售表中的,所以在最后一步求总数量的时候减去。