跪求一条sql语句,关于库存统计的。

ganvie 2008-09-14 11:04:49
1)产品表

代码
1
2
3
4
5

2)入库表
代码 入库数量 入库时间
1 10 2008-06-09
3 15 2008-09-10

3)出库表
代码 出库数量 出库时间
2 15 2008-05-10
3 10 2008-09-12

4)库存表(库存归零就删掉)
代码 当前库存
1 20
3 15
目标:

统计表(统计九月份仓库进出情况,期初库存用倒推)

代码 期初库存 入库数量 出库数量 期末库存
1 20 0 0 20
2 0 0 0 0
3 10 15 10 15
4 0 0 0 0
5 0 0 0 0

折腾了三天了,效果都不理想,求高人授句!
...全文
291 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyqwan11112 2008-09-15
  • 打赏
  • 举报
回复

--5楼说的有道理
--4楼的也有点小问题
if object_id('产品表')is not null
drop table 产品表
if object_id('入库表')is not null
drop table 入库表
if object_id('出库表')is not null
drop table 出库表
if object_id('库存表')is not null
drop table 库存表
go
create table 产品表
( 代码 int)
create table 入库表
(代码 int,
入库数量 int,
入库时间 datetime
)
create table 出库表
( 代码 int,
出库数量 int,
出库时间 datetime
)
create table 库存表
( 代码 int,
当前库存 int
)
insert into 产品表 select 1
union all select 2
union all select 3
union all select 4
union all select 5
insert into 入库表 select 1,10,'2008-06-09'
union all select 3,15,'2008-09-10'
insert into 出库表 select 2,15,'2008-05-10'
union all select 3,10,'2008-09-12'
insert into 库存表 select 1,20
union all select 3,15
-----------
select 产品表.代码,期初库存=isnull(库存表.当前库存,0)+isnull(出库表.出库数量,0)-isnull(入库表.入库数量,0),入库数量=isnull(入库表.入库数量,0),
出库数量=isnull(出库表.出库数量,0),期末库存=isnull(库存表.当前库存,0)
from 产品表 left join 入库表 on 产品表.代码=入库表.代码 and convert(varchar(7),入库表.入库时间,120) = '2008-09'
left join 出库表 on 产品表.代码=出库表.代码 and convert(varchar(7),出库表.出库时间,120) = '2008-09'
left join 库存表 on 产品表.代码=库存表.代码

hyqwan11112 2008-09-15
  • 打赏
  • 举报
回复

--二楼的结果可能没测试,有点问题

--1)产品表
create table PRO(代码 INT)

INSERT INTO PRO
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5


--2)入库表
create table RK(代码 INT,入库数量 int ,入库时间 varchar(10))

INSERT INTO RK
SELECT 1,10,'2008-06-09' UNION SELECT 3,15,'2008-09-10'



--3)出库表

create table KK(代码 INT,出库数量 int ,出库时间 varchar(10))

INSERT INTO KK
SELECT 2,15,'2008-05-10' UNION SELECT 3,10,'2008-09-12'


--4)库存表(库存归零就删掉)
create table KC(代码 INT,当前库存 int)

INSERT INTO KC
SELECT 1,20 UNION SELECT 3,15


select a.代码,

期初库存 = isnull(sum(d.当前库存),0) - (isnull(sum(b.入库数量),0) - isnull(sum(c.出库数量),0)) ,
isnull(sum(b.入库数量),0) 入库数量,
isnull(sum(c.出库数量),0) 出库数量,
isnull(sum(d.当前库存),0) 期末库存
from PRO a
left join RK b on a.代码 = b.代码 and datepart(mm,b.入库时间 ) = 9
left join KK c on a.代码 = c.代码 and datepart(mm,c.出库时间 ) = 9
left join KC d on a.代码 = d.代码
group by a.代码

drop table PRO,RK,KK,KC
-晴天 2008-09-15
  • 打赏
  • 举报
回复
create table 产品表(代码 int)
insert into 产品表 select 1
union all select 2
union all select 3
union all select 4
union all select 5

create table 入库表(代码 int,入库数量 int,入库时间 datetime)
insert into 入库表 select 1,10,'2008-06-09'
union all select 3,15,'2008-09-10'
union all select 3,20,'2008-10-05' --统计是在十月份进行,可能又有十月份的记录

create table 出库表(代码 int,出库数量 int,出库时间 datetime)
insert into 出库表 select 2,15,'2008-05-10'
union all select 3,10,'2008-09-12'
union all select 3,10,'2008-10-08' --同上

create table 库存表(代码 int,当前库存 int)
insert into 库存表 select 1, 20
union all select 3,25 --设当前时间为十月二十日
go
select a.代码,
期初库存 =isnull(b.当前库存,0)
+(select isnull(sum(出库数量),0) from 出库表 where 代码=a.代码 and convert(varchar(7),出库时间,120)>='2008-09')
-(select isnull(sum(入库数量),0) from 入库表 where 代码=a.代码 and convert(varchar(7),入库时间,120)>='2008-09'),
入库数量=(select isnull(sum(入库数量),0) from 入库表 where 代码=a.代码 and convert(varchar(7),入库时间,120)='2008-09'),
出库数量=(select isnull(sum(出库数量),0) from 出库表 where 代码=a.代码 and convert(varchar(7),出库时间,120)='2008-09'),
期末库存 =isnull(b.当前库存,0)
+(select isnull(sum(出库数量),0) from 出库表 where 代码=a.代码 and convert(varchar(7),出库时间,120)>'2008-09')
-(select isnull(sum(入库数量),0) from 入库表 where 代码=a.代码 and convert(varchar(7),入库时间,120)>'2008-09')
from 产品表 a left join 库存表 b on a.代码=b.代码

go
drop table 产品表,入库表,出库表,库存表
/*
代码 期初库存 入库数量 出库数量 期末库存
----------- ----------- ----------- ----------- -----------
1 20 0 0 20
2 0 0 0 0
3 10 15 10 15
4 0 0 0 0
5 0 0 0 0

(5 行受影响)

*/
-晴天 2008-09-15
  • 打赏
  • 举报
回复
楼主的数据库设计有问题:当前库存与期末库存恐怕不是一回事吧.如果还坚持这样设计,那要求的结果不应该是"九月份"仓库进出情况",而因是"2008年9月"库存进出情况.因为还要把当前数据倒推到二零零八年九月底的状态,没有年,是不好做的.

2008年9月底的库存:当前库存-十月初后入库+十月初后出库
2008年9月初的库存:当前库存-九月初后入库+九月初后出库
语句应为:
create table 产品表(代码 int)
insert into 产品表 select 1
union all select 2
union all select 3
union all select 4
union all select 5

create table 入库表(代码 int,入库数量 int,入库时间 datetime)
insert into 入库表 select 1,10,'2008-06-09'
union all select 3,15,'2008-09-10'

create table 出库表(代码 int,出库数量 int,出库时间 datetime)
insert into 出库表 select 2,15,'2008-05-10'
union all select 3,10,'2008-09-12'

create table 库存表(代码 int,当前库存 int)
insert into 库存表 select 1, 20
union all select 3,15
go
select a.代码,
期初库存 =isnull(b.当前库存,0)
+(select isnull(sum(出库数量),0) from 出库表 where 代码=a.代码 and convert(varchar(7),出库时间,120)>='2008-09')
-(select isnull(sum(入库数量),0) from 入库表 where 代码=a.代码 and convert(varchar(7),入库时间,120)>='2008-09'),
入库数量=(select isnull(sum(入库数量),0) from 入库表 where 代码=a.代码 and convert(varchar(7),入库时间,120)='2008-09'),
出库数量=(select isnull(sum(出库数量),0) from 出库表 where 代码=a.代码 and convert(varchar(7),出库时间,120)='2008-09'),
期末库存 =isnull(b.当前库存,0)
+(select isnull(sum(出库数量),0) from 出库表 where 代码=a.代码 and convert(varchar(7),出库时间,120)>'2008-09')
-(select isnull(sum(入库数量),0) from 入库表 where 代码=a.代码 and convert(varchar(7),入库时间,120)>'2008-09')
from 产品表 a left join 库存表 b on a.代码=b.代码

go
drop table 产品表,入库表,出库表,库存表
/*
代码 期初库存 入库数量 出库数量 期末库存
----------- ----------- ----------- ----------- -----------
1 20 0 0 20
2 0 0 0 0
3 10 15 10 15
4 0 0 0 0
5 0 0 0 0

(5 行受影响)

*/
-狙击手- 2008-09-15
  • 打赏
  • 举报
回复
顶楼上
Garnett_KG 2008-09-15
  • 打赏
  • 举报
回复
改个字段名称,数量-->库存结余


SELECT 品名,本月出库 = IsNull(
(
SELECT SUM(数量)
FROM 出库表
WHERE 品名=a.品名 AND 出库时间 Between '2008-09-01' AND '2008-09-30'
),0),

本月进库= IsNull(
(
SELECT SUM(数量)
FROM 进库表
WHERE 品名=a.品名 AND 入库时间 Between '2008-09-01' AND '2008-09-30'
),0),
数量 as 库存结余
FROM 库存表 as A


Garnett_KG 2008-09-15
  • 打赏
  • 举报
回复
按9楼的需求,应该很简单




SELECT 品名,本月出库 = IsNull(
(
SELECT SUM(数量)
FROM 出库表
WHERE 品名=a.品名 AND 出库时间 Between '2008-09-01' AND '2008-09-30'
),0),

本月进库= IsNull(
(
SELECT SUM(数量)
FROM 进库表
WHERE 品名=a.品名 AND 入库时间 Between '2008-09-01' AND '2008-09-30'
),0),
数量
FROM 库存表 as A




ganvie 2008-09-15
  • 打赏
  • 举报
回复
非常感谢楼上的答复,为了能够让各位高手更好的解决我的问题,我把我的数据库结构跟大家描述一下。
主要有四个表,1)库存表 2)出库表 3)进库表 4)临时进库表(写进库表时,同时写入相同的记录,这样在出库时,我就不用动库存表和进库表了。根据时间先后顺序,逐笔扣减临时进库表。这样做的目的主要是为了实现先进先出。) 目前这四张表状态如下:
1)库存表(里面的记录是货品当前的状态)
截至到目前
品名 数量

碳酸 100
硫酸 50
淀粉 200
水处理剂 150
油 300
2)出库表
品名 数量 出库时间
碳酸 15 2008-07-12
淀粉 10 2008-07-30
碳酸 10 2008-08-21
硫酸 13 2008-08-23
水处理剂 10 2008-09-01
水处理剂 12 2008-09-05
淀粉 13 2008-09-10
3)进库表
品名 数量 进库时间
碳酸 20 2008-08-10
碳酸 11 2008-08-12
硫酸 12 2008-09-01
淀粉 13 2008-09-03
硫酸 15 2008-09-10

就是说相同的月份内同一种产品可能会多次进出库,所以要把他们的进库或出库总额相加。

最后假设我要统计九月份数据,那就是这样一种格式
统计时间:9月份

品名 本月出库 本月进库 库存结余(库存表里的数据)
碳酸 0 0 100
硫酸 0 27 50
淀粉 13 13 200
水处理剂 22 0 150
油 0 0 300

这样来解释各位大大应该更好理解一些。多谢了!
ChinaJiaBing 2008-09-14
  • 打赏
  • 举报
回复

if object_id('产品表')is not null
drop table 产品表
if object_id('入库表')is not null
drop table 入库表
if object_id('出库表')is not null
drop table 出库表
if object_id('库存表')is not null
drop table 库存表
go
create table 产品表
( 代码 int)
create table 入库表
(代码 int,
入库数量 int,
入库时间 datetime
)
create table 出库表
( 代码 int,
出库数量 int,
出库时间 datetime
)
create table 库存表
( 代码 int,
当前库存 int
)
insert into 产品表 select 1
union all select 2
union all select 3
union all select 4
union all select 5
insert into 入库表 select 1,10,'2008-06-09'
union all select 3,15,'2008-09-10'
insert into 出库表 select 2,15,'2008-05-10'
union all select 3,10,'2008-09-12'
insert into 库存表 select 1,20
union all select 3,15
-----------
select 产品表.代码,期初库存=isnull(库存表.当前库存,0),isnull(入库表.入库数量,0),
isnull(出库表.出库数量,0),期末库存=isnull(库存表.当前库存,0)
from 产品表 left join 入库表 on 产品表.代码=入库表.代码
left join 出库表 on 产品表.代码=出库表.代码
left join 库存表 on 产品表.代码=库存表.代码
林虎 2008-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyflystone 的回复:]
select a.代码,
期初库存 = isnull(d.期末库存,0) - (isnull(b.入库数量,0) - isnull(c.出库数量,0))
isnull(b.入库数量,0) 入库数量,
isnull(c.出库数量,0) 出库数量,
isnull(d.期末库存,0) 期末库存
from 产品表 a
left join 入库表 b on a.代码 = b.代码
left join 出库表 c on a.代码 = c.代码
left join 库存表 d on a.代码 = d.代码
where datepart(mm,b.入库时间 ) = 9 and da…
[/Quote]


..
duanzhi1984 2008-09-14
  • 打赏
  • 举报
回复
给你个建议:

1、如果你的数据量很大的话,建议你将每次入出库时的时候更新在库
当入库的时候更新在库,以增加在库,相反,出库时削减在库

2、如果数据量不大,只是查询用,则可以这样做。楼上的语句没有汇总数据。



1)产品表
create table PRO(代码 INT)

INSERT INTO PRO
SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5


2)入库表
create table RK(代码 INT,入库数量 int ,入库时间 varchar(10))

INSERT INTO RK
SELECT 1,10,'2008-06-09' UNION SELECT 3,15,'2008-09-10'UNION SELECT 3,15,'2008-09-11'



3)出库表

create table KK(代码 INT,出库数量 int ,出库时间 varchar(10))

INSERT INTO KK
SELECT 2,15,'2008-05-10' UNION SELECT 3,10,'2008-09-12'


4)库存表(库存归零就删掉)
create table KC(代码 INT,当前库存 int)

INSERT INTO KC
SELECT 2,20 UNION SELECT 3,15

代码 当前库存
1 20
3 15
目标:

统计表(统计九月份仓库进出情况,期初库存用倒推)

代码 期初库存 入库数量 出库数量 期末库存
1 20 0 0 20
2 0 0 0 0
3 10 15 10 15
4 0 0 0 0
5 0 0 0 0




select a.代码,

期初库存 = isnull(sum(d.当前库存),0) - (isnull(sum(b.入库数量),0) - isnull(sum(c.出库数量),0)) ,
isnull(sum(b.入库数量),0) 入库数量,
isnull(sum(c.出库数量),0) 出库数量,
isnull(sum(d.当前库存),0) 期末库存
from PRO a
left join RK b on a.代码 = b.代码
left join KK c on a.代码 = c.代码
left join KC d on a.代码 = d.代码
where datepart(mm,b.入库时间 ) = 9 and datepart(mm,c.出库时间 ) = 9
group by a.代码

-狙击手- 2008-09-14
  • 打赏
  • 举报
回复
select a.代码,
期初库存 = isnull(d.期末库存,0) - (isnull(b.入库数量,0) - isnull(c.出库数量,0))
isnull(b.入库数量,0) 入库数量,
isnull(c.出库数量,0) 出库数量,
isnull(d.期末库存,0) 期末库存
from 产品表 a
left join 入库表 b on a.代码 = b.代码
left join 出库表 c on a.代码 = c.代码
left join 库存表 d on a.代码 = d.代码
where datepart(mm,b.入库时间 ) = 9 and datepart(mm,c.入库时间 ) = 9

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧