入库出库表,求库存,这个sql怎么写?

专注or全面 2012-03-08 09:33:26
把问题简化了说


--入库数(一个sql从入库表中按天分组汇总统计出来的)



日期 当天入库

2012-02-20 1000

2012-02-22 1500



--出库数据(一个sql从出库表中按天分组统计出来的)


日期 当天出库

2012-02-20 500

2012-02-21 300

2012-02-22 500

2012-02-24 400




--求下面的结果



日期 入库/出库类型 数量 库存

2012-02-20 入库 1000 500

2012-02-20 出库 500 500

2012-02-21 出库 300 200

2012-02-22 入库 1500 1200

2012-02-22 出库 500 1200

2012-02-24 出库 400 800
...全文
1529 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
潇洒王子 2012-06-15
  • 打赏
  • 举报
回复
看过了,都写的挺好
sdfgdfgsdfgsfg 2012-06-08
  • 打赏
  • 举报
回复
USE TEMPDB
GO
IF OBJECT_ID('TB_IN') IS NOT NULL DROP TABLE TB_IN
IF OBJECT_ID('TB_OUT') IS NOT NULL DROP TABLE TB_OUT
GO
CREATE TABLE TB_IN(
IN_DATE DATETIME
,TOTAL INT
)
CREATE TABLE TB_OUT(
OUT_DATE DATETIME
,TOTAL INT
)
INSERT INTO TB_IN
SELECT '2012-02-20', 1000 UNION ALL
SELECT '2012-02-22', 1500
INSERT INTO TB_OUT
SELECT '2012-02-20', 500 UNION ALL
SELECT '2012-02-21', 300 UNION ALL
SELECT '2012-02-22', 500 UNION ALL
SELECT '2012-02-24', 400
GO
;WITH MU AS (
SELECT *,ROW_NUMBER() OVER(ORDER BY CHANGE_DATE,CASE WHEN TYPE='入库' THEN 1 ELSE 2 END) AS ROW FROM (
SELECT IN_DATE AS CHANGE_DATE,TOTAL,'入库' AS TYPE FROM TB_IN
UNION ALL
SELECT OUT_DATE,0-TOTAL,'出库' AS TYPE FROM TB_OUT
) T
)
,MU2 AS (
SELECT *,TOTAL AS [库存] FROM MU WHERE ROW=1
UNION ALL
SELECT T1.*,T2.[库存]+T1.TOTAL
FROM MU T1
INNER JOIN MU2 T2 ON T1.ROW=T2.ROW+1
)
SELECT CHANGE_DATE AS [日期],TYPE AS [类型], ABS(TOTAL) AS [变更数量],[库存]
FROM MU2
/*
日期 类型 变更数量 库存
2012-02-20 00:00:00.000 入库 1000 1000
2012-02-20 00:00:00.000 出库 500 500
2012-02-21 00:00:00.000 出库 300 200
2012-02-22 00:00:00.000 入库 1500 1700
2012-02-22 00:00:00.000 出库 500 1200
2012-02-24 00:00:00.000 出库 400 800
*/
sdfgdfgsdfgsfg 2012-06-08
  • 打赏
  • 举报
回复
declare @t1 table (D datetime,Qty float)
declare @t2 table (D datetime,Qty float)

insert into @t1
select '2012-02-20', 1000 union all
select '2012-02-22', 1500

insert into @t2
select '2012-02-20', 500 union all
select '2012-02-21', 300 union all
select '2012-02-22', 500 union all
select '2012-02-24', 400

select identity(int,1,1) as id,* into #t from
(select D,Qty In_Qty,0 Out_Qty from @t1
union all
select D,0,Qty from @t2) t
order by D,In_Qty desc
select D as '日期',
case when In_Qty>0 then '入库' else '出库' end as '入库/出库类型',
case when In_Qty>0 then In_qty else Out_Qty end as '数量',
(select sum(In_Qty)-sum(Out_Qty) from #t where id<=t.id) as '库存'
from #t as t

drop table #t

  • 打赏
  • 举报
回复
筱筱的方法,顶一个。这个问题说到底还是递归统计问题
kaikai_kk 2012-03-09
  • 打赏
  • 举报
回复
再看了一下,原来LZ要按天来算???那变一下

select D as '日期',
case when In_Qty>0 then '入库' else '出库' end as '入库/出库类型',
case when In_Qty>0 then In_qty else Out_Qty end as '数量',
(select sum(In_Qty)-sum(Out_Qty) from #t where id<=(select max(id) from #t where d=t.d)) as '库存'
from #t as t
/*
日期 入库/出库类型 数量 库存
----------------------- ------- ---------------------- ----------------------
2012-02-20 00:00:00.000 入库 1000 500
2012-02-20 00:00:00.000 出库 500 500
2012-02-21 00:00:00.000 出库 300 200
2012-02-22 00:00:00.000 入库 1500 1200
2012-02-22 00:00:00.000 出库 500 1200
2012-02-24 00:00:00.000 出库 400 800

(6 行受影响)
*/


Riygpw 2012-03-09
  • 打赏
  • 举报
回复
这么复杂吗?
yusheng622 2012-03-09
  • 打赏
  • 举报
回复
标记回看!
寡亾 2012-03-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 x_wy46 的回复:]

SQL code


--按我的想法用临时表组成以下三个表信息


--日期-库存对应关系表

--入库信息表

--出库信息表

--入库出库合并行与日期-库存对应关系表再合并列
[/Quote]我要死。。。按照你的思路。。。我死勒。。。楼上的都强大。 学习@@@@!!!!
寡亾 2012-03-09
  • 打赏
  • 举报
回复
[code=SQL]
--余下那一列明天给你解决,瞌睡了。
use tempdb
go

create table in_INVS
(
iid int,
idates datetime,
iquantity int
)

create table out_INVS
(
uid int,
udates datetime,
uquantity int
)

insert into in_INVS
select 1,'2012-02-20',1000 union all
select 2,'2012-02-22',1500

insert into out_INVS
select 1,'2012-02-20',500 union all
select 2,'2012-02-21',300 union all
select 3,'2012-02-22',500 union all
select 4,'2012-02-24',400
select * from in_INVS
select * from out_INVS
--------------------------------------------------
create procedure tempINVS
as
begin
create table #3
(
idates datetime,
IN_OUT_TYPE nvarchar(10),
quantity int,
trueQuantity int
)
insert into #3(idates,IN_OUT_TYPE,quantity,trueQuantity)
select idates,'入库',iquantity,0
from in_INVS

insert into #3(idates,IN_OUT_TYPE,quantity,trueQuantity)
select udates,'出库',uquantity,0
from out_INVS

select * from #3
end
[/CODE]
kaikai_kk 2012-03-08
  • 打赏
  • 举报
回复
最好有一个递增ID,SQL2005以上版本可以用ROW_NUMBER()产生ID,下面是用临时表,好理解点

declare @t1 table (D datetime,Qty float)
declare @t2 table (D datetime,Qty float)

insert into @t1
select '2012-02-20', 1000 union all
select '2012-02-22', 1500

insert into @t2
select '2012-02-20', 500 union all
select '2012-02-21', 300 union all
select '2012-02-22', 500 union all
select '2012-02-24', 400

select identity(int,1,1) as id,* into #t from
(select D,Qty In_Qty,0 Out_Qty from @t1
union all
select D,0,Qty from @t2) t
order by D,In_Qty desc

select D as '日期',
case when In_Qty>0 then '入库' else '出库' end as '入库/出库类型',
case when In_Qty>0 then In_qty else Out_Qty end as '数量',
(select sum(In_Qty)-sum(Out_Qty) from #t where id<=t.id) as '库存'
from #t as t

drop table #t

/*
日期 入库/出库类型 数量 库存
----------------------- ------- ---------------------- ----------------------
2012-02-20 00:00:00.000 入库 1000 1000
2012-02-20 00:00:00.000 出库 500 500
2012-02-21 00:00:00.000 出库 300 200
2012-02-22 00:00:00.000 入库 1500 1700
2012-02-22 00:00:00.000 出库 500 1200
2012-02-24 00:00:00.000 出库 400 800

(6 行受影响)
*/
_0筱筱0_ 2012-03-08
  • 打赏
  • 举报
回复
USE TEMPDB
GO
IF OBJECT_ID('TB_IN') IS NOT NULL DROP TABLE TB_IN
IF OBJECT_ID('TB_OUT') IS NOT NULL DROP TABLE TB_OUT
GO
CREATE TABLE TB_IN(
IN_DATE DATETIME
,TOTAL INT
)
CREATE TABLE TB_OUT(
OUT_DATE DATETIME
,TOTAL INT
)
INSERT INTO TB_IN
SELECT '2012-02-20', 1000 UNION ALL
SELECT '2012-02-22', 1500
INSERT INTO TB_OUT
SELECT '2012-02-20', 500 UNION ALL
SELECT '2012-02-21', 300 UNION ALL
SELECT '2012-02-22', 500 UNION ALL
SELECT '2012-02-24', 400
GO
;WITH MU AS (
SELECT *,ROW_NUMBER() OVER(ORDER BY CHANGE_DATE,CASE WHEN TYPE='入库' THEN 1 ELSE 2 END) AS ROW FROM (
SELECT IN_DATE AS CHANGE_DATE,TOTAL,'入库' AS TYPE FROM TB_IN
UNION ALL
SELECT OUT_DATE,0-TOTAL,'出库' AS TYPE FROM TB_OUT
) T
)
,MU2 AS (
SELECT *,TOTAL AS [库存] FROM MU WHERE ROW=1
UNION ALL
SELECT T1.*,T2.[库存]+T1.TOTAL
FROM MU T1
INNER JOIN MU2 T2 ON T1.ROW=T2.ROW+1
)
SELECT CHANGE_DATE AS [日期],TYPE AS [类型], ABS(TOTAL) AS [变更数量],[库存]
FROM MU2
/*
日期 类型 变更数量 库存
2012-02-20 00:00:00.000 入库 1000 1000
2012-02-20 00:00:00.000 出库 500 500
2012-02-21 00:00:00.000 出库 300 200
2012-02-22 00:00:00.000 入库 1500 1700
2012-02-22 00:00:00.000 出库 500 1200
2012-02-24 00:00:00.000 出库 400 800
*/
专注or全面 2012-03-08
  • 打赏
  • 举报
回复


--按我的想法用临时表组成以下三个表信息


--日期-库存对应关系表

--入库信息表

--出库信息表

--入库出库合并行与日期-库存对应关系表再合并列

专注or全面 2012-03-08
  • 打赏
  • 举报
回复
要的是一个进出记录组合信息再加上一个算出来的列
专注or全面 2012-03-08
  • 打赏
  • 举报
回复
按天来算的,比如说2012-02-20进来1000,出了500,那么这一天的库存为500
那么记录要显示为:


日期 进/出类型 数量 库存
2012-02-20 进 1000 500
2012-02-20 出 500 500
寡亾 2012-03-08
  • 打赏
  • 举报
回复
日期 入库/出库类型 数量 库存

2012-02-20 入库 1000 500

2012-02-20 出库 500 500

2012-02-21 出库 300 200

2012-02-22 入库 1500 1200

2012-02-22 出库 500 1200

2012-02-24 出库 400 800


不好意思,之前需求没看清。
不过还是有点不明白。 比如说你要的结果的第一条,和第二条, 入库1000,库存500, 出库500,库存500.
如果是 入库1000,库存1000 出库500 库存500 我还能想来。
能否解释一下。
寡亾 2012-03-08
  • 打赏
  • 举报
回复
你这个算是什么出入库,仓库只有一种产品的话还可以,只做记录。 数量就是入库数-出库数 没啥可写。
如果是真正的仓库,是这么做的。每个货品有一个唯一的物品编号,入库先查询有没有这么货品,没有就是给仓库表插入这个货品,同时产生一天入库记录。有了就是修改货品的数量,同时新增一条入库记录。 出库也一样,先查询仓库表,有了出,修改仓库表货品数量。(库存是否足量,根据需求自己判读,是否允许负库存,是否有缺货记录)
这样做,你要看库存直接就查询仓库表、
专注or全面 2012-03-08
  • 打赏
  • 举报
回复
存库等于入库减出库的

真的木人?

27,580

社区成员

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

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