Oracle-SQL-按月统计自助终端交易量

SQL实现的目标:

基本情况现金交易情况转账情况转账交易情况(明细)其它业务情况交易量汇总日均交易量交易金额绩效情况(万元)
支行名支行号所属网点网点号管理员帐户管理员终端编号取款笔数取款金额存款笔数存款金额转账笔数转账金额卡卡笔数卡卡金额卡折笔数卡折金额折卡笔数折卡金额折折笔数折折金额代缴费笔数代缴费金额查询笔数存款余额(月日均)存款余额(月日均比上月)
巴南支行                10101302东泉分理处    402230080416813378骆涌2300332612715195051433007135620000330804104820025343816 208812 21.020.19
巴南支行                10103201跳石分理处    402230080344302189万敏2300187435729406280327320141005100000427000107351000754120543 721892 295.229.01
巴南支行                10100401木洞分理处    402230080350688018唐自利23001620674512739.4295534862252060800031850043018018157400001541253591 1253681 228.960.48

 

规则,  每天每种交易最多统计3笔

完成按月统计任务

 

用到的知识点总结:

1) case when的使用;

case  when count(transQK.tran_amt) > 3 then 3  else count(transQK.tran_amt) end  count
case  when dayQK.count is null then 0 else dayQK.count end

2)left join的使用;   left join 中可以写where 的条件

--外连接取款
left join 
    ( 
    select
        case  when sum(dayQKIn.count) is null then 0 else sum(dayQKIn.count)  end count,
        case  when sum(dayQKIn.money) is null then 0 else sum(dayQKIn.money)  end money,
        term_id_in
    from
    (
        select 
            case  when count(transQK.tran_amt) > 3 then 3  else count(transQK.tran_amt) end  count,
            case  when sum(transQK.tran_amt) is null then 0 else sum(transQK.tran_amt)  end  money,
            to_char(to_date(transQK.p_req_date, 'yyyyMMdd'), 'dd') p_req_date,
            term_id_in
        from 
            BIZ_OPER_TRANS transQK
        where  
        -- 取款 便民取款
            (transQK.P_TRANS_CODE='1011101' or transQK.P_TRANS_CODE='1011231')
            and     transQK.p_req_date between to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd') and to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')
        group by 
            term_id_in,P_TRANS_CODE,to_char(to_date(transQK.p_req_date, 'yyyyMMdd'), 'dd')
        ) dayQKIn
         group by dayQKIn.term_id_in
    ) dayQK
    on dayQK.term_id_in=term.TERMINAL_ID 

 

 

3) 时间函数 表示  上个月第一天  、 上个月最后一天   

transCX.p_req_date between to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd') and to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')

 

4)四舍五入   月笔数/天数

round(( case  when dayQK.count is null then 0 else dayQK.count end + 
    case  when dayCK.count is null then 0 else dayCK.count end +
    case  when dayZZ.count is null then 0 else dayZZ.count end + 
    case  when dayDJ.count is null then 0 else dayDJ.count end + 
    case  when dayCX.count is null then 0 else dayCX.count end )
    /(1+to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')-to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd')),2)

 

 

5)  最终的SQL

 

-----------------------------------终极版终结版-------------------------------------------------------
-- 每月每种交易最多统计3笔
-- T05 便民终端
select 
    parent.inst_code 支行号,
    parent.inst_name 支行名,
    inst.inst_code 网点号,
    inst.inst_name 网点名,
    term.admin_Acct 管理员账户 ,
    term.admin_Name 管理员, 
    term.terminal_id 终端号,
    case  when dayQK.count is null then 0 else dayQK.count end   取款笔数,
    case  when dayQK.money is null then 0 else dayQK.money end   取款金额,
    case  when dayCK.count is null then 0 else dayCK.count end   存款笔数,
    case  when dayCK.money is null then 0 else dayCK.money end   存款金额,
    case  when dayZZ.count is null then 0 else dayZZ.count end   转账笔数,
    case  when dayZZ.money is null then 0 else dayZZ.money end   转账金额,
    case  when dayDJ.count is null then 0 else dayDJ.count end   代缴笔数,
    case  when dayDJ.money is null then 0 else dayDJ.money end   代缴金额,
    case  when dayCX.count is null then 0 else dayCX.count end   查询笔数,
    -- 汇总
    case  when dayQK.count is null then 0 else dayQK.count end + 
    case  when dayCK.count is null then 0 else dayCK.count end +
    case  when dayZZ.count is null then 0 else dayZZ.count end + 
    case  when dayDJ.count is null then 0 else dayDJ.count end + 
    case  when dayCX.count is null then 0 else dayCX.count end 总笔数,
    -- 这里用了四舍五入
    round(( case  when dayQK.count is null then 0 else dayQK.count end + 
    case  when dayCK.count is null then 0 else dayCK.count end +
    case  when dayZZ.count is null then 0 else dayZZ.count end + 
    case  when dayDJ.count is null then 0 else dayDJ.count end + 
    case  when dayCX.count is null then 0 else dayCX.count end )
    /(1+to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')-to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd')),2) 日均笔数,
    --
    case  when dayQK.money is null then 0 else dayQK.money end + 
    case  when dayCK.money is null then 0 else dayCK.money end +
    case  when dayZZ.money is null then 0 else dayZZ.money end + 
    case  when dayDJ.money is null then 0 else dayDJ.money end  总金额
--
from 
    ops_device_info device ,ops_institution inst,ops_institution parent ,OPS_TERMINAL_INFO term 
--外连接取款
left join 
    ( 
    select
        case  when sum(dayQKIn.count) is null then 0 else sum(dayQKIn.count)  end count,
        case  when sum(dayQKIn.money) is null then 0 else sum(dayQKIn.money)  end money,
        term_id_in
    from
    (
        select 
            case  when count(transQK.tran_amt) > 3 then 3  else count(transQK.tran_amt) end  count,
            case  when sum(transQK.tran_amt) is null then 0 else sum(transQK.tran_amt)  end  money,
            to_char(to_date(transQK.p_req_date, 'yyyyMMdd'), 'dd') p_req_date,
            term_id_in
        from 
            BIZ_OPER_TRANS transQK
        where  
        -- 取款 便民取款
            (transQK.P_TRANS_CODE='1011101' or transQK.P_TRANS_CODE='1011231')
            and     transQK.p_req_date between to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd') and to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')
        group by 
            term_id_in,P_TRANS_CODE,to_char(to_date(transQK.p_req_date, 'yyyyMMdd'), 'dd')
        ) dayQKIn
         group by dayQKIn.term_id_in
    ) dayQK
    on dayQK.term_id_in=term.TERMINAL_ID 
--外连接存款
left join 
(
    select
        case  when sum(dayCKIn.count) is null then 0 else sum(dayCKIn.count)  end count,
        case  when sum(dayCKIn.money) is null then 0 else sum(dayCKIn.money)  end money,
        term_id_in
    from
    (
        select 
            case  when count(transCK.tran_amt) > 3 then 3  else count(transCK.tran_amt) end  count,
            case  when sum(transCK.tran_amt) is null then 0 else sum(transCK.tran_amt)  end  money,
            to_char(to_date(transCK.p_req_date, 'yyyyMMdd'), 'dd') p_req_date,
            term_id_in
        from 
            BIZ_OPER_TRANS transCK
        where  
            (transCK.P_TRANS_CODE='1011103' or transCK.P_TRANS_CODE='1011232')
        and    transCK.p_req_date between
            to_char(add_months(last_day(sysdate) + 1, -2), 'yyyyMMdd') and
            to_char(add_months(last_day(sysdate), -1), 'yyyyMMdd')
        group by 
            term_id_in,P_TRANS_CODE,to_char(to_date(transCK.p_req_date, 'yyyyMMdd'), 'dd')
        ) dayCKIn
        group by dayCKIn.term_id_in
    ) dayCK
    on dayCK.term_id_in=term.TERMINAL_ID 
--外连接转账
left join 
(
    select
        case  when sum(dayZZIn.count) is null then 0 else sum(dayZZIn.count)  end count,
        case  when sum(dayZZIn.money) is null then 0 else sum(dayZZIn.money)  end money,
        term_id_in
    from
    (
        select 
            case  when count(transZZ.tran_amt) > 3 then 3  else count(transZZ.tran_amt) end  count,
            case  when sum(transZZ.tran_amt) is null then 0 else sum(transZZ.tran_amt)  end  money,
            to_char(to_date(transZZ.p_req_date, 'yyyyMMdd'), 'dd') p_req_date,
            term_id_in
        from 
            BIZ_OPER_TRANS transZZ
        where  
            ( transZZ.P_TRANS_CODE='1011105' or transZZ.P_TRANS_CODE='1011203' or transZZ.P_TRANS_CODE='1011206' or
            transZZ.P_TRANS_CODE='1011233' or transZZ.P_TRANS_CODE='1011107' )
        and    transZZ.p_req_date between to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd') and         to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')
        group by 
            term_id_in,P_TRANS_CODE,to_char(to_date(transZZ.p_req_date, 'yyyyMMdd'), 'dd')
        ) dayZZIn
    group by dayZZIn.term_id_in
    ) dayZZ
    on dayZZ.term_id_in=term.TERMINAL_ID 
--代缴费
left join 
(
    select
        case  when sum(dayDJIn.count) is null then 0 else sum(dayDJIn.count)  end count,
        case  when sum(dayDJIn.money) is null then 0 else sum(dayDJIn.money)  end money,
        term_id_in
    from
    (
        select 
        case  when count(transDJ.tran_amt) > 3 then 3  else count(transDJ.tran_amt) end  count,
        case  when sum(transDJ.tran_amt) is null then 0 else sum(transDJ.tran_amt)  end  money,
        to_char(to_date(transDJ.p_req_date, 'yyyyMMdd'), 'dd') p_req_date,
        term_id_in
        from 
        BIZ_OPER_TRANS transDJ
    where  
        ( transDJ.P_TRANS_CODE='1011105' or transDJ.P_TRANS_CODE='1011203' or transDJ.P_TRANS_CODE='1011206' or
        transDJ.P_TRANS_CODE='1011233' or transDJ.P_TRANS_CODE='1011107' )
    and    transDJ.p_req_date between to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd') and to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')
         group by 
        term_id_in,P_TRANS_CODE,to_char(to_date(transDJ.p_req_date, 'yyyyMMdd'), 'dd')
            ) dayDJIn
    group by dayDJIn.term_id_in
    ) dayDJ
    on dayDJ.term_id_in=term.TERMINAL_ID 
--查询
left join 
(
    select
        case  when sum(dayCXIn.count) is null then 0 else sum(dayCXIn.count)  end count,
        term_id_in
    from
    (
        select 
        case  when count(transCX.tran_amt) > 3 then 3  else count(transCX.tran_amt) end  count,
        to_char(to_date(transCX.p_req_date, 'yyyyMMdd'), 'dd') p_req_date,
        term_id_in
        from 
        BIZ_OPER_TRANS transCX
    where  
        ( transCX.P_TRANS_CODE='1011105' or transCX.P_TRANS_CODE='1011203' or transCX.P_TRANS_CODE='1011206' or
        transCX.P_TRANS_CODE='1011233' or transCX.P_TRANS_CODE='1011107' ) 
    and transCX.p_req_date between to_char(add_months(last_day(sysdate)+1,-2),'yyyyMMdd') and to_char(add_months(last_day(sysdate),-1),'yyyyMMdd')
         group by 
        term_id_in,P_TRANS_CODE,to_char(to_date(transCX.p_req_date, 'yyyyMMdd'), 'dd')
            ) dayCXIn
    group by dayCXIn.term_id_in
    ) dayCX
    on dayCX.term_id_in=term.TERMINAL_ID 
--
where 1=1 
    and device.DEVICE_TYPE='T05' 
    and term.TERMINAL_ID=device.TERMINAL_ID 
    and term.inst_id=inst.inst_id
    and inst.PARENT_INST_ID=parent.inst_id 
    --
    -- and term.admin_name is not null  
     and inst.inst_level=3 
;

 

这个sql写的不好,太臃肿,  可以用交易码分组查询(然后用decode函数处理)

转载于:https://www.cnblogs.com/yangw/p/4423018.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值