读书人

关于求期初数期末数的SQL,该怎么解决

发布时间: 2012-03-28 15:40:03 作者: rapoo

关于求期初数期末数的SQL
关于这个问题不好怎么描述,具体请各位大牛看下面的数据就很清晰了:

时期公司编码银行编码流入流出
2011000010011010000
201212101001102030
2012121110011030100
201100001002128000
2012121810021210090
20121219100212200100

对于上面的数据需要统计出期初及期末
规则是:
1、对于时期后4为是0000的表示期初时期,他的期初数就是这个时期的流入数,期末数也是流入数
2、对于其他时期不同公司不同银行的期初等于上个时期的期末数,它的期末数为这个时期的期初数加上流入数减去流出数

如下所示:

时期公司编码银行编码期初数流入流出期末数
201100001001101000100001000
2012121010011010002030990
2012121110011099030100920
201100001002128008000800
2012121810021280010090810
20121219100212810200100910


[解决办法]
TB 你的表……

SQL code
select tb.*,sum(流入- 流出)over(partition by 公司编码,银行编码 order by 时期 asc) from tb
[解决办法]
SQL code
with t as (select '20110000' a , '1001' b, '10' c, 1000 d, 0 e from dualunion allselect '20121210' a , '1001' b, '10' c, 20 d, 30 e from dualunion allselect '20121211' a , '1001' b, '10' c, 30 d, 100 e from dualunion allselect '20110000' a , '1002' b, '12' c, 800 d, 0 e from dualunion allselect '20121218' a , '1002' b, '12' c, 100 d, 90 e from dualunion allselect '20121219' a , '1002' b, '12' c, 200 d, 100 e from dual)select tt.a,tt.b,tt.c,decode(substr(tt.a,-4),'0000',tt.d,lag(tt.m) over(partition by tt.b,tt.c order by tt.a)),tt.d,tt.e,tt.mfrom (select t.a,t.b,t.c,t.d,t.e,sum(t.d-t.e)over(partition by t.b,t.c order by t.a) m from t ) tt
[解决办法]
实测数据:
SQL code
CREATE TABLE T131(    Period VARCHAR2(20),    CompCode VARCHAR2(20),    BankCode VARCHAR2(20),    InFlow  NUMBER(6),    OutFlow NUMBER(6));INSERT INTO T131 VALUES('20110000', '1001', '10', 1000, 0);INSERT INTO T131 VALUES('20121210', '1001', '10', 20, 30);INSERT INTO T131 VALUES('20121211', '1001', '10', 30, 100);INSERT INTO T131 VALUES('20110000', '1002', '12', 800, 0);INSERT INTO T131 VALUES('20111218', '1002', '12', 100, 90);INSERT INTO T131 VALUES('20111219', '1002', '12', 200, 100); 

读书人网 >oracle

热点推荐