首先感谢昨天你帮忙的解答!这里还要再询问个问题,希望你指点下。
--仓库流水表
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 、得到当年的每个月的 期初值、入库数、出库数、库存数。select
时间,
(库存+出库-入库) 期初,
入库,
出库,
库存
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
)
----
--报表是固定的 1-12 月份,中间如果有没有空出的月份,也要在表中显示为值为0.
--我效果实现是在前台利用月份直接匹配一次,如果没有匹配到的,就赋值为0.
--但是我自己反思,这个处理在后台也应该能做。可是我自己没有想出如何在这条查询语句的基础上直接处理。
--所以想请问下这个处理能直接在这条查询语句的基础上做处理嘛?希望指点下,学习!
--仓库流水表
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 、得到当年的每个月的 期初值、入库数、出库数、库存数。select
时间,
(库存+出库-入库) 期初,
入库,
出库,
库存
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
)
----
--报表是固定的 1-12 月份,中间如果有没有空出的月份,也要在表中显示为值为0.
--我效果实现是在前台利用月份直接匹配一次,如果没有匹配到的,就赋值为0.
--但是我自己反思,这个处理在后台也应该能做。可是我自己没有想出如何在这条查询语句的基础上直接处理。
--所以想请问下这个处理能直接在这条查询语句的基础上做处理嘛?希望指点下,学习!
with t (select rownum from dual connect by rownum<=12)
跟你的结果来个左关联.
WITH t AS (SELECT add_months(trunc(SYSDATE,'yyyy'),ROWNUM-1) stat_date FROM dual CONNECT BY ROWNUM<12),
t1 AS(你的统计语句)
SELECT t.stat_date,nvl(入库,0)........ FROM t,t1 WHERE to_char(t.stat_date,'yyyymm')=to_char(t1.时间,'yyyymm')(+);
能说下 这里 用add_months 和直接用rownuw的区别嘛?
时间,
(库存+出库-入库) 期初,
入库,
出库,
库存
from(
select
b.ym 时间,
sum(nvl(a.入库,0)-nvl(a.出库,0))over(order by b.ym)库存,
nvl(a.入库,0)入库,
nvl(a.出库,0)出库
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
WHERE shijian BETWEEN '2009' AND '2010'
group by substr(shijian,0,7)
)a,
(SELECT '2009'||'-'||TO_number(ROWNUM,'fm00') ym FROM all_objects WHERE ROWNUM<=12) b
WHERE a.时间(+)=b.ym
)
原来如此就解决了(SELECT '2009'||'-'||TO_number(ROWNUM,'fm00') ym FROM all_objects WHERE ROWNUM<=12) b
WHERE a.时间(+)=b.ym