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

SQL实现的目标:

基本情况 现金交易情况 转账情况 转账交易情况(明细) 其它业务情况 交易量汇总 日均交易量 交易金额 绩效情况(万元)
支行名 支行号 所属网点 网点号 管理员帐户 管理员 终端编号 取款笔数 取款金额 存款笔数 存款金额 转账笔数 转账金额 卡卡笔数 卡卡金额 卡折笔数 卡折金额 折卡笔数 折卡金额 折折笔数 折折金额 代缴费笔数 代缴费金额 查询笔数 存款余额(月日均) 存款余额(月日均比上月)
巴南支行                 10 101302 东泉分理处     402230080416813378 骆涌 23003326 127 151950 51 43300 7 13562 0 0 0 0 3 3080 4 10482 0 0 253 438 16  208812  21.02 0.19
巴南支行                 10 103201 跳石分理处     402230080344302189 万敏 23001874 357 294062 80 327320 14 100510 0 0 0 0 4 27000 10 73510 0 0 754 1205 43  721892  295.22 9.01
巴南支行                 10 100401 木洞分理处     402230080350688018 唐自利 23001620 674 512739.4 295 534862 25 206080 0 0 3 18500 4 30180 18 157400 0 0 1541 2535 91  1253681  228.96 0.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

时间: 2024-10-28 21:23:43

Oracle-SQL-按月统计自助终端交易量的相关文章

sql按月统计数量和按月累加统计数量

1.简单的,按月统计数量 SELECT CREATE_DATE, DATE_FORMAT(CREATE_DATE, '%Y-%m') AS month , COUNT(*) AS sum FROM pt_user GROUP BY month; 2.按月累加统计数据 SELECT a.month, SUM(b.total) AS total FROM ( SELECT DATE_FORMAT(CREATE_DATE, '%Y-%m') AS month, SUM(sum) AS total FR

SQL SERVER 月、季、年统计与常用查询语句汇总

一.SQL SERVER 月.季.年统计查询 --本天 SELECT *FROM dbo.TableName WHERE DATEDIFF(DAY,TimeField,getdate())= 0; --本周 SELECT *FROM dbo.TableName WHERE DATEDIFF(WEEK,TimeField,getdate())= 0; --本月 SELECT *FROM dbo.TableName WHERE DATEDIFF(MONTH,TimeField,getdate())=

Oracle SQL 调优健康检查脚本

Oracle SQL 调优健康检查脚本 我们关注数据库系统的性能,进行数据库调优的主要工作就是进行SQL的优化.良好的数据架构设计.配合应用系统中间件和写一手漂亮的SQL,是未来系统上线后不出现致命性能问题的有力保证. 在CBO时代,一个SQL的执行计划是多样的.影响执行计划的因素也从过去RBO时代的SQL书写规则变为综合性因素.这为我们生成更加优秀执行计划提供了基础,同时也给我们进行调优带来的很多麻烦. 目前我们通常的做法,是通过AWR报告或者调试手段,发现某某SQL有问题,之后从Librar

oracle sql优化

第一掌 避免对列的操作 任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数.计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数. 例1:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢: select * from record where  substrb(CardNo,1,4)='5378'(13秒) select * from record where  amount/30< 1000(11秒) select * from recor

oracle sql资源消耗相关视图

一.常用视图说明 Oracle sql语句资源消耗监控,最常用的系统视图有: v$sql v$sqlarea v$sqltext v$session v$sql和v$sqlarea基本相同,记录了共享SQL区(share pool)中SQL统计信息,如内存消耗.IO(物理磁盘读和逻辑内存读).排序操作.哈希ID等数据.不同之处在于v$sql为每一条SQL保留一个条目,而v$sqlarea中根据sql_text(需要注意,该处存储的为当前SQL指针的前1000个字符,也就是说这里记录的SQL可能是

《精通Oracle SQL(第2版) 》

<精通Oracle SQL(第2版) > 基本信息 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj ShamsudeenJared Still 译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115351661 上架时间:2014-5-5 出版日期:2014 年5月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 数据库 > Oracle 更多关于>&g

【重磅干货】看了此文,Oracle SQL优化文章不必再看!

听“俊”一席话,胜读十年书.看了这篇由DBA+社群联合发起人丁俊大师(网名:dingjun123)分享的SQL优化大作,其他Oracle SQL优化文章都不必再看了! 专家简介 丁俊 网名:dingjun123 DBA+社群联合发起人 性能优化专家,Oracle ACEA,ITPUB开发版资深版主.8年电信行业从业经验,在某大型电信系统提供商工作7年,任资深工程师,从事过系统开发与维护.业务架构和数据分析.系统优化等工作.擅长基于ORACLE的系统优化,精通SQL.PL/SQL.JAVA等.电子

Oracle SQL日期比较和常用日期函数

一.oracle sql日期比较 在今天之前: select * from up_date where update < to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') select * from up_date where update <= to_date('2007-09-07 00:00:00','yyyy-mm-dd hh24:mi:ss') 在今天只后: select * from up_date where updat

常用Oracle SQL语句(汇总版)

Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字段名2, ……) SELECT (字段名1, 字段名2, ……) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’ 如果字段值里包含单引号’ 需要