日期:2014-05-18  浏览次数:20436 次

仓库进销存帐的过程写法
商品表

商品名 编号 库存 
A 101 100  
B 102 200  

销售表
单号 品名 数量 
A01 A 30  
A02 B 100  

进货表

单号 品名 数量 
B01 A 50  
B02 B 30  

如何在每月的三十一号,自动生成商品进销存帐,如

商品名 编号 原始库存 本月入库 本月出库 本期结存
a 101 100 50 30 120
b 102 200 30 100 130

因为库存的表的记录超过十万条,每月销售及进货的记录亦超过几千条,怎么写最有效率呢?
----------------------------------------------------------------------
2、如果上述三表都有一个字段,仓库名(即多仓库) 如

商品名 编号 库存 仓库
A 101 100 W1
B 102 200 W2 
A 101 100 W2
B 102 200 W1

因为库存的表的记录超过十万条,每月销售及进货的记录亦超过几千条,怎么写最有效率呢?

销售表
单号 品名 数量 仓库
A01 A 30 W1
A02 B 100 W1
A01 A 30 W2
A02 B 100 W2

进货表

单号 品名 数量 仓库
B01 A 50 W2
B02 B 30 W2
B01 A 50 W1
B02 B 30 W1

如何在每月的三十一号,自动生成商品进销存帐,如

商品名 编号 W1原始库存 W1入库 W1出库 W1结存 W2原始库存 W2入库 W2出库 W1结存 原始总库存 总结存
A 101 100 50 30 120 100 50 30 120 200 420
B 102 200 30 100 130 200 30 100 130 400 260  

因为库存的表的记录超过十万条,每月销售及进货的记录亦超过几千条,怎么写最有效率呢?

------解决方案--------------------
SQL code

select a.商品名,a.仓库,原始库存 = a.库存,
  本月入库 = isnull(c.数量,0),本月出库 = isnull(b.数量,0),本期结存 = a.库存 - isnull(b.数量,0), + isnull(c.数量,0),
from 商品表 a
left join (select 商品名,数量 = sum(数量),仓库 from 销售表 group by 商品名,仓库) b on a.商品名 = b.商品名 and a.仓库 = b.仓库
left join (select 商品名,数量 = sum(数量),仓库 from 进货表 group by 商品名,仓库) c on a.商品名 = c.商品名 and a.仓库 = c.仓库


--1 这样的结果是对商品表的每一个产品都有了结余信息,报表格式你可以再加工
--2 设置作业在结余日生成报表到指定目录即可

------解决方案--------------------

select 商品名,编号,
SUM(case when 仓库='W1' then 原始库存 else 0 end) W1原始库存,
SUM(case when 仓库='W1' then 本月入库 else 0 end) W1本月入库,
SUM(case when 仓库='W1' then 本月出库 else 0 end) W1本月出库,
SUM(case when 仓库='W1' then 本期结存 else 0 end) W1结存,
SUM(CASE WHEN 仓库='W2' then 原始库存 else 0 end) W2原始库存,
SUM(CASE WHEN 仓库='W2' then 本月入库 else 0 end) W2本月入库,
SUM(CASE WHEN 仓库='W2' then 本月出库 else 0 end) W2本月出库,
SUM(CASE WHEN 仓库='W2' then 本期结存 else 0 end) W2结存,
SUM(case when 仓库='W1' then 原始库存 else 0 end)+SUM(CASE WHEN 仓库='W2' then 原始库存 else 0 end ) AS 原始总库存,
SUM(case when 仓库='W1' then 本期结存 else 0 end)+SUM(CASE WHEN 仓库='W2' then 本期结存 else 0 end)AS 总结存
from (
select a.商品名,a.编号,a.仓库,a.库存 as 原始库存,c.数量 as 本月入库,b.数量 as 本月出库,a.库存+c.数量-b.数量 as 本期结存
from #商品表 as a
inner join #销售表 as b 
on b.品名=a.商品名
and b.仓库=a.仓库
inner join #进货表 as c
on c.品名=a.商品名
and c.仓库=a.仓库) as a
GROUP BY 商品名,编号