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

库藏统计_存储过程

2013-08-01 
库存统计_存储过程一张出入库表FStore 主要字段为单据主键单据编号单据时间单据类型物品类型ID物品数量1入

库存统计_存储过程
一张出入库表FStore 主要字段为
单据主键       单据编号     单据时间     单据类型   物品类型ID   物品数量
1             入库单001    2013-7-1       1         1001       20
2             入库单002    2013-7-2       1         1001       10
3             入库单003    2013-7-2       1         1002       50
4             出库单001    2013-7-10      2         1001       25
5             出库单002    2013-7-12      2         1002       30

入库单类型为1 出库为2
-------------------我想按照先进先出的原则对入库单进行统计,如以下结果--------------------
 
 入库单号       入库时间   物品类型ID    入库数量    已出库数量            剩余数量
 入库单001     2013-7-1     1001         20          20                  0
 入库单002     2013-7-2     1001         10           5                  5
 入库单003     2013-7-10    1002         50          30                 20
-------------已单据时间做为查询条件,传如开始时间和结束时间2个参数写一个存储过程请问怎么写-----------


[解决办法]
LZ测试数据是不是写错了。

1             入库单001    2013-7-1       1         1001       20
4             出库单001    2013-7-10      2         1001       25

入库单001 入库数量=20 出库数量是25???
[解决办法]


if OBJECT_ID('tb') is not null
drop table tb
create table tb
(
单据主键 int,
单据编号 varchar(50),
单据时间 datetime,
单据类型 int,
物品类型ID int,
物品数量 int
)

insert into tb 
select 1,'001','2013-7-1',1,1001,20 union all
select 1,'001','2013-7-1',1,1001,5 union all
select 2,'002','2013-7-2',1,1001,10 union all
select 3,'003','2013-7-2',1,1002,50 union all
select 4,'001','2013-7-10',2,1001,15 union all
select 5,'002','2013-7-12',2,1002,10
go

create proc proc_name
@beginTime datetime='2013-7-1',
@endTime datetime='2013-7-3'
as
begin

;with tab as(
select 入库单号=单据编号,入库时间=单据时间,物品类型ID,入库数量=sum(物品数量),
出库数量=isnull((select SUM(物品数量) from tb t2 where t2.单据编号=t1.单据编号 and t2.单据类型=2),0)
from tb t1
where 单据类型=1 and 单据时间 between @beginTime and @endTime group by 单据编号,单据时间,物品类型ID
)
select *,剩余数量=入库数量-出库数量 from tab

end

--exec proc_name @beginTime='2013-7-1',@endTime='2013-9-4'

-----------------------------
0012013-07-01 00:00:00.0001001251510
0022013-07-02 00:00:00.000100110100
0032013-07-02 00:00:00.000100250050

[解决办法]

create table FStore
(单据主键  int, 单据编号 varchar(16), 单据时间 date, 单据类型 int, 物品类型ID int, 物品数量 int)



insert into FStore
 select 1, '入库单001', '2013-7-1', 1, 1001, 20 union all
 select 2, '入库单002', '2013-7-2', 1, 1001, 10 union all
 select 3, '入库单003', '2013-7-2', 1, 1002, 50 union all
 select 4, '出库单001', '2013-7-10', 2, 1001, 25 union all
 select 5, '出库单002', '2013-7-12', 2, 1002, 30


with t as
(select a.单据编号 '入库单号',
        a.单据时间 '入库时间',
        a.物品类型ID,
        a.物品数量 '入库数量',
        (select sum(b.物品数量)
         from FStore b 
         where b.单据类型=2 and b.物品类型ID=a.物品类型ID
         and b.单据时间>a.单据时间) 'x',
        (select sum(c.物品数量)
         from FStore c
         where c.单据类型=1 and c.物品类型ID=a.物品类型ID
         and c.单据时间<=a.单据时间) 'y'        
 from FStore a
 where a.单据类型=1
)
select 入库单号,入库时间,物品类型ID,入库数量,
       case when y<=x then 入库数量 else 入库数量-(y-x) end '已出库数量',
       入库数量-case when y<=x then 入库数量 else 入库数量-(y-x) end '剩余数量'
 from t

/*
入库单号             入库时间       物品类型ID      入库数量        已出库数量       剩余数量
---------------- ---------- ----------- ----------- ----------- -----------
入库单001           2013-07-01 1001        20          20          0
入库单002           2013-07-02 1001        10          5           5
入库单003           2013-07-02 1002        50          30          20



(3 row(s) affected)
*/

热点排行