大家好
     我现在有一张表PDRCTable
id     单号          性质        料号     数量  仓库名称  类别   制作人  制作日期
1  MR2010120001 原材料入库      A      1.00    电气仓    入库 admin 2010-12-21
2  MR2010120001 原材料入库      B      2.00    电气仓    入库 admin 2010-12-21
3  MR2010120002 贸易品入库      C      3.00    贸易仓    入库 admin 2010-12-25
4  MR2010120002 贸易品入库      D      3.00    贸易仓    入库 admin 2010-12-25
5  MR2010120003 原材料入库      E      1.00    机械仓    入库 admin 2010-12-26
6  MR2010120003 原材料入库      F      1.00    机械仓    入库 admin 2010-12-26
7  MR2010120003 原材料入库      B      2.00    机械仓    入库 admin 2010-12-26
8  PC2010120001 贸易品出库      C      3.00    贸易仓    出库 admin 2010-12-26
9  PC2010120002 贸易品出库      D      2.00    贸易仓   出库 admin 2010-12-26
10 PC2010120003 原材料出库      A      1.00    电气仓   出库 admin 2010-12-26
11 PC2010120003 原材料出库      B      1.00    电气仓   出库 admin 2010-12-26
     还有一张表PDTable
id     单号          料号   实盘数量    仓库名称  制作人    制作日期
33   PD2010120011     R   2.00     贸易仓    admin    2010-12-24
34   PD2010120011     A      2.00     贸易仓    admin    2010-12-24
35   PD2010120011     B      6.00     贸易仓    admin    2010-12-24
36   PD2010120012     C      3.00     维修仓    admin    2010-12-24
37   PD2010120012     D      3.00     维修仓    admin    2010-12-24
38   PD2010120012     E      35.00     维修仓    admin    2010-12-24
39   PD2010120012     F      1.00     维修仓    admin    2010-12-24
40   PD2010120012     G   3.00       维修仓    admin    2010-12-24
41   PD2010120013     Q      2.00     其它仓    admin    2010-12-24
42   PD2010120009     W   1.00     电气仓    admin    2010-12-24
43   PD2010120009     Y      1.00     电气仓    admin    2010-12-24
44   PD2010120009     P   1.00     电气仓    admin    2010-12-24
45   PD2010120009     M   1.00     电气仓    admin    2010-12-24我想要得到按照不同的仓库为条件,找到对应这个仓库的盘点单的对应的制作日期之后的出入库情况,然后按照不同的仓库进行盘点。也就是上期盘点+盘点之后的入库-盘点之后的出库,最终得到以下的效果:
             R   2.00     贸易仓    
    A      2.00     贸易仓    
    B      6.00     贸易仓    
    D      1.00     贸易仓 
             C      3.00     维修仓    
             D      3.00     维修仓    
             E      35.00     维修仓   
             F      1.00     维修仓    
             G   3.00       维修仓 
             Q      2.00     其它仓
             W   1.00     电气仓  
             Y      1.00     电气仓 
             P   1.00     电气仓
             M   1.00     电气仓
             A      1.00       电气仓 
             E      1.00     机械仓    
             F      1.00     机械仓    
             B      2.00     机械仓      不用存储过程,需要最后得到一张视图,这个应该怎么实现呢?

解决方案 »

  1.   


    select [料号],[仓库名称],
    [实盘数量]+(select sum(case when [类别]="入库" then [数量] else 0-[数量] end) 
      from PDRCTable where pd.[料号]=[料号] and pd.[仓库名称]=[仓库名称] and [制作日期]>pd.[制作日期]) [数量]
    from PDTable pd
    union all
    select [料号],[仓库名称],sum(case when [类别]="入库" then [数量] else 0-[数量] end) 
    from PDRCTable pdrc
    where not exists (select * from PDTable where pdrc.[料号]=[料号] and pdrc.[仓库名称]=[仓库名称])
    group by [料号],[仓库名称]
      

  2.   

    结果和楼主的结果不太一样,不知楼主是不是算得有点儿不对.
    create table PDRCTable(id int,单号 nvarchar(15),性质 nvarchar(10),料号 nvarchar(10),数量 decimal(16,2),仓库名称 nvarchar(10),类别 nvarchar(10),制作人 nvarchar(10),制作日期 datetime)
    insert into PDRCTable select 1,'MR2010120001','原材料入库','A',1.00,'电气仓','入库','admin','2010-12-21'
    insert into PDRCTable select 2,'MR2010120001','原材料入库','B',2.00,'电气仓','入库','admin','2010-12-21'
    insert into PDRCTable select 3,'MR2010120002','贸易品入库','C',3.00,'贸易仓','入库','admin','2010-12-25'
    insert into PDRCTable select 4,'MR2010120002','贸易品入库','D',3.00,'贸易仓','入库','admin','2010-12-25'
    insert into PDRCTable select 5,'MR2010120003','原材料入库','E',1.00,'机械仓','入库','admin','2010-12-26'
    insert into PDRCTable select 6,'MR2010120003','原材料入库','F',1.00,'机械仓','入库','admin','2010-12-26'
    insert into PDRCTable select 7,'MR2010120003','原材料入库','B',2.00,'机械仓','入库','admin','2010-12-26'
    insert into PDRCTable select 8,'PC2010120001','贸易品出库','C',3.00,'贸易仓','出库','admin','2010-12-26'
    insert into PDRCTable select 9,'PC2010120002','贸易品出库','D',2.00,'贸易仓','出库','admin','2010-12-26'
    insert into PDRCTable select 10,'PC2010120003','原材料出库','A',1.00,'电气仓','出库','admin','2010-12-26'
    insert into PDRCTable select 11,'PC2010120003','原材料出库','B',1.00,'电气仓','出库','admin','2010-12-26'
    create table PDTable(id int,单号 nvarchar(15),料号 nvarchar(10),实盘数量 decimal(16,2),仓库名称 nvarchar(10),制作人 nvarchar(10),制作日期 datetime)
    insert into PDTable select 33,'PD2010120011','R',2.00,'贸易仓','admin','2010-12-24'
    insert into PDTable select 34,'PD2010120011','A',2.00,'贸易仓','admin','2010-12-24'
    insert into PDTable select 35,'PD2010120011','B',6.00,'贸易仓','admin','2010-12-24'
    insert into PDTable select 36,'PD2010120012','C',3.00,'维修仓','admin','2010-12-24'
    insert into PDTable select 37,'PD2010120012','D',3.00,'维修仓','admin','2010-12-24'
    insert into PDTable select 38,'PD2010120012','E',35.00,'维修仓','admin','2010-12-24'
    insert into PDTable select 39,'PD2010120012','F',1.00,'维修仓','admin','2010-12-24'
    insert into PDTable select 40,'PD2010120012','G',3.00,'维修仓','admin','2010-12-24'
    insert into PDTable select 41,'PD2010120013','Q',2.00,'其它仓','admin','2010-12-24'
    insert into PDTable select 42,'PD2010120009','W',1.00,'电气仓','admin','2010-12-24'
    insert into PDTable select 43,'PD2010120009','Y',1.00,'电气仓','admin','2010-12-24'
    insert into PDTable select 44,'PD2010120009','P',1.00,'电气仓','admin','2010-12-24'
    insert into PDTable select 45,'PD2010120009','M',1.00,'电气仓','admin','2010-12-24'
    go
    select 料号,
    实盘数量=实盘数量+isnull((
    select sum((case when 类别='入库' then 数量 else -数量 end)) from PDRCTable where 料号=a.料号 and 仓库名称=a.仓库名称 and 制作日期>a.制作日期
    ),0),仓库名称 from PDTable a
    union all
    select 料号,sum((case when 类别='入库' then 数量 else -数量 end))as 实盘数量,仓库名称 from PDRCTable a
     where not exists(select 1 from PDTable where 料号=a.料号 and 仓库名称=a.仓库名称)
    group by 料号,仓库名称 having sum((case when 类别='入库' then 数量 else -数量 end))<>0
    go
    drop table PDTable,PDRCTable
    /*
    料号         实盘数量                                    仓库名称
    ---------- --------------------------------------- ----------
    R          2.00                                    贸易仓
    A          2.00                                    贸易仓
    B          6.00                                    贸易仓
    C          3.00                                    维修仓
    D          3.00                                    维修仓
    E          35.00                                   维修仓
    F          1.00                                    维修仓
    G          3.00                                    维修仓
    Q          2.00                                    其它仓
    W          1.00                                    电气仓
    Y          1.00                                    电气仓
    P          1.00                                    电气仓
    M          1.00                                    电气仓
    B          1.00                                    电气仓
    B          2.00                                    机械仓
    E          1.00                                    机械仓
    F          1.00                                    机械仓
    D          1.00                                    贸易仓(18 行受影响)*/对第二个表中没有的,那第一个表中应该不管日期.