账期间隔问题(脚本写法)

表A有这样的数据
BANK_ID BILL     charge
304521 200705 20
304521 200706 20
304521 200707 20
304521 200708 20
304521 200710 20
304521 200711 20
304521 200712 20
304521 200801 20
304523 200803 10
304523 200805 10
304523 200809 10
304523 200810 10
304523 200811 10
304523 200812 10
304523 200901 10
304523 200902 10
我要得到这样的数据
BANK_ID  BILL                                                                      CHARGE      
304521    200705-200708,200710-200801                           160
304523    200801,200803,200805,200809-200902                  80

 

create table HSK_TEST_TABLE
(
  BANK_ID     NUMBER,
  BILL            VARCHAR2(6),
  CHARGE      NUMBER
);


insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200705', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200706', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200707', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200708', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200710', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200711', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200712', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304521, '200801', 20);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200803', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200805', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200809', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200810', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200811', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200812', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200901', 10);
insert into HSK_TEST_TABLE (BANK_ID, BILL, CHARGE)
values (304523, '200902', 10);
commit;

 

SELECT bank_id,wmsys.wm_concat(min_bill||'-'||max_bill),SUM(charge) AS charge
  FROM (SELECT bank_id,MIN(bill) AS min_bill,MAX(bill) AS max_bill,SUM(charge) AS charge
         FROM (SELECT t.*, ROW_NUMBER() OVER(PARTITION BY bank_id ORDER BY bill) AS RN
                 FROM HSK_TEST_TABLE t
              )
        GROUP BY bank_id,MONTHS_BETWEEN(TO_DATE(bill,'YYYYMM'),DATE '2000-1-1') - rn
        )
GROUP BY bank_id
;

 

改进版本:

1.ROW_NUMBER() 改为DENSE_RANK()更好,可以有两个月相同也可分为一组
2.查出结果相同的合并,所以我做如下改进

SELECT bank_id,wmsys.wm_concat(nvl2(nullif(min_bill,max_bill),min_bill||'-'||max_bill,max_bill)),
SUM(charge) AS charge
  FROM (SELECT bank_id,MIN(bill) AS min_bill,MAX(bill) AS max_bill,SUM(charge) AS charge
         FROM (SELECT t.*, DENSE_RANK() OVER(PARTITION BY bank_id ORDER BY bill) AS RN
                 FROM HSK_TEST_TABLE t
              )
        GROUP BY bank_id,MONTHS_BETWEEN(TO_DATE(bill,'YYYYMM'),DATE '2000-1-1') - rn
        )
GROUP BY bank_id
;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21220558/viewspace-588696/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21220558/viewspace-588696/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值