首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

再问材料出入明细帐解决方法

2012-01-10 
再问材料出入明细帐表1:盘点表(每月月底将盘点的实际数量输进去)字段:盘点日期产品名称盘点数量2007-4-28A

再问材料出入明细帐
表1:盘点表(每月月底将盘点的实际数量输进去)
字段:
盘点日期       产品名称       盘点数量
2007-4-28     AAAA               2000
...
表2:材料出入明细表(当月材料出入明细)
字段:
出入库日期       产品名称     收发类型     数量
2007-5-29           AAAA             入库           1000
2007-5-29           bbbb             入库           2000
2009-5-30           AAAA             出库             50
...
要实现的结果:
---------------------------
日期               产品名称       收发类型       入库数量       出库数量       结存数量
---------------------------
                        AAAA             期初结存                                                   2000
2007-5-29       AAAA             入库               1000                                     3000
2007-5-30       AAAA             出库                                         50               2950
...

拜托了...


[解决办法]
select a.出入库日期,a.产品名称,b.入库数量,b.出库数量,(b.入库数量+b.出库数量+c.盘点数量)as 结存数量
from A a
left join
(
select 产品名称 ,sum(case when 收发类型= '入库 ' then 数量 else 0 end)as 入库数量,
sum(case when 收发类型= '出库 ' then -数量 else 0 end)as 出库数量
from A --出入明细表
group by 产品名称
)B b on a.产品名称=b.产品名称
left join
(
select 产品名称 , isnull(盘点数量,0)as 盘点数量 from B --盘点表
)c on a.产品名称=c.产品名称

[解决办法]
select 产品名称,日期,收发类型,
入库数=case 收发类型 when '入库 ' then 数量 end,
出库数=case 收发类型 when '出库 ' then 数量 end,
[结存]=(select sum(case 收发类型 when '入库 ' or '期初结存 ' then 数量+ else -数量 end)
from test where 日期 <=a.日期)
from
(select * from test union all
select 盘点日期, 产品名称, '期初结存 ', 盘点数量,
from 盘点表 ) a
[解决办法]
create table 盘点表(盘点日期 datetime,产品名称 varchar(20),盘点数量 int)
create table 明细表(出入库日期 datetime,产品名称 varchar(20),收发类型 varchar(20),数量 int)

insert 盘点表 select '2007-4-28 ', 'AAAA ',2000
union all select '2007-5-29 ', 'bbbb ',3000

insert 明细表 select '2007-5-29 ', 'AAAA ', '入库 ',1000
union all select '2007-5-29 ', 'bbbb ', '入库 ',2000
union all select '2009-5-30 ', 'AAAA ', '出库 ',50

select 日期,产品名称,收发类型,入库数,出库数,结存数量 from
(
select top 100 percent 日期=null,产品名称,收发类型= '期初结存 ',入库数=null,出库数=null,结存数量=盘点数量,bh=1 from 盘点表
union all
select top 100 percent 出入库日期,产品名称,收发类型,入库数=case 收发类型 when '入库 ' then 数量 end,


出库数=case 收发类型 when '出库 ' then 数量 end,
结存数量=(select sum(case 收发类型 when '入库 ' then 数量 else -数量 end)
from 明细表 where 出入库日期 <=a.出入库日期),bh=2
from 明细表 a
order by 产品名称,bh
)b
order by 产品名称,b.bh

drop table 盘点表,明细表

/*
日期 产品名称 收发类型 入库数 出库数 结存数量
-------------------------- --------- --------------- ----------- ----------- ------
NULL AAAA 期初结存 NULL NULL 2000
2007-05-29 00:00:00.000 AAAA 入库 1000 NULL 3000
2009-05-30 00:00:00.000 AAAA 出库 NULL 50 2950
NULL bbbb 期初结存 NULL NULL 3000
2007-05-29 00:00:00.000 bbbb 入库 2000 NULL 3000

(所影响的行数为 5 行)*/

热点排行