--仓库流水表
create table ruku(
rid varchar2(20) not null, //流水单号
hetongdanhao varchar2(20) , //合同单号
tzid varchar2(20) , //通知单号
wid varchar2(20) , //物品编号
cangkuid number(10) , //仓库编号
shuliang number(10), //流水数量
shijian varchar2(30) , //流水时间
leixing number(8) //流水类型 (入库1、出库2、期初3))--要求通过 cangkuid 、wid 、得到当年的每个月的 期初值、入库数、出库数、库存数。--期初值 == 1月的期初等于上1年的库存,(也可以直接初始为0)。
--库存数 == 当月期初值 + 当月入库总数 - 当月出库总数 。--查询sql:select
时间,
sum(入库) 入库, sum(出库) 出库,
(sum(入库)-sum(出库))as 库存from ( select substr(shijian,0,7)as 时间,
( case when leixing=1 then rkshuliang else 0 end) as 入库,
( case when leixing=2 then rkshuliang else 0 end) as 出库
from ruku
)agroup by 时间
--我不知道这里期初要怎么表现出来,求大侠帮帮忙!!!-- 展现效果如下 月份 期初 入库 出库 库存
1 0 300 100 200
2 200 400 300 300
3 300 300 400 200
create table ruku(
rid varchar2(20) not null, //流水单号
hetongdanhao varchar2(20) , //合同单号
tzid varchar2(20) , //通知单号
wid varchar2(20) , //物品编号
cangkuid number(10) , //仓库编号
shuliang number(10), //流水数量
shijian varchar2(30) , //流水时间
leixing number(8) //流水类型 (入库1、出库2、期初3))--要求通过 cangkuid 、wid 、得到当年的每个月的 期初值、入库数、出库数、库存数。--期初值 == 1月的期初等于上1年的库存,(也可以直接初始为0)。
--库存数 == 当月期初值 + 当月入库总数 - 当月出库总数 。--查询sql:select
时间,
sum(入库) 入库, sum(出库) 出库,
(sum(入库)-sum(出库))as 库存from ( select substr(shijian,0,7)as 时间,
( case when leixing=1 then rkshuliang else 0 end) as 入库,
( case when leixing=2 then rkshuliang else 0 end) as 出库
from ruku
)agroup by 时间
--我不知道这里期初要怎么表现出来,求大侠帮帮忙!!!-- 展现效果如下 月份 期初 入库 出库 库存
1 0 300 100 200
2 200 400 300 300
3 300 300 400 200
入库,出库, 库存
from(
select
时间,
sum(入库-出库)over(order by 时间)库存,入库,出库
from ( select substr(shijian,0,7)as 时间,
sum( case when leixing=1 then rkshuliang else 0 end) as 入库,
sum( case when leixing=2 then rkshuliang else 0 end) as 出库
from ruku
group by substr(shijian,0,7)
)a)
(select
时间,
sum(入库) 入库, sum(出库) 出库,
from ( select substr(shijian,0,7)as 时间,
( case when leixing=1 then rkshuliang else 0 end) as 入库,
( case when leixing=2 then rkshuliang else 0 end) as 出库
from ruku
)a
group by 时间)
--多了个逗号,楼主说下测试结果
select 时间,入库,出库,sum(入库-出库) over(order by 时间)+入库-出库 as 期初from
(select
时间,
sum(入库) 入库, sum(出库) 出库
from ( select substr(shijian,0,7)as 时间,
( case when leixing=1 then rkshuliang else 0 end) as 入库,
( case when leixing=2 then rkshuliang else 0 end) as 出库
from ruku
)a
group by 时间)
--多了个逗号,楼主说下测试结果
select 时间,入库,出库,sum(入库-出库) over(order by 时间)+入库-出库 as 期初from
(select
时间,
sum(入库) 入库, sum(出库) 出库
from ( select substr(shijian,0,7)as 时间,
( case when leixing=1 then rkshuliang else 0 end) as 入库,
( case when leixing=2 then rkshuliang else 0 end) as 出库
from ruku
)a
group by 时间)
白天在做事,没注意看回复。
刚刚做了测试,好像有问题。
期初的结果不对,
我数据库里面 1月的 总入库数 = 600; 总出库数 = 100; 这里我1月的期初是做0来处理的,按道理得到的库存应该是 500. 但是得到的期初是1000, 2月 总入库为 = 100 , 总出库 = 100,期初显示的是 500.测试结果不对。
另外我在期初的里面少写了一个条件, 1月期初等于去年结余,而后面月份的期初 都等于上个月的库存。
按年来分的话sum()over()后面加个partition by 参数即可
1月期初用case +lag()over()
具体就不写了,实在不知道截取前7位是怎么表示年月的