笔者:iamlasong

1、需求

两个表,投递记录表和封发开拆记录表,如今想知道投递日期距最后一次封发日期天数分布情况。

对这个需求,须要先查询出投递明细,同一时候要知道相应的邮件最后一次封发情况。如机构、日期等。

2、明细查询

考虑到一天可能封发多次,所以取日期和时间都是最大的那条,语句例如以下:

select d.city,d.ssxs,d.zj_code,d.zj_mc,c.mail_num,
c.dlv_date,to_char(c.dlv_time,'hh24miss'), c.actual_goods_fee,
c.dlv_pseg_code,c.dlv_pseg_name,c.dlv_bureau_name,
c.dlv_staff_code,c.dlv_staff_name,c.signer_name,
a.deal_org_code,a.dlv_org_code,a.label_strip,a.deal_date,a.deal_time
from tb_evt_bag_mail_rela a, tb_evt_dlv c, tb_jg d
where a.mail_num = c.mail_num
and a.bag_actn_code = '3'
and c.dlv_date between to_date('2014-6-1', 'yyyy-mm-dd') and
to_date('2014-6-1', 'yyyy-mm-dd')
and c.dlv_bureau_org_code = d.zj_code
and c.dlv_sts_code = 'I'
and d.jgfl = 'yz'
and (a.deal_date, a.deal_time) =
(select max(t.deal_date), max(t.deal_time)
from tb_evt_bag_mail_rela t
where t.mail_num = a.mail_num
and t.bag_actn_code = '3'
group by t.mail_num, t.bag_actn_code)

3、时限分布

有了明细语句。时间分布就比較简单了。语句例如以下:

select d.city, d.ssxs, d.zj_code, d.zj_mc, count(*) ttzl,
Sum(Decode(c.Dlv_Date - a.deal_date, 0, 1, 0)) t0,
Sum(Decode(c.Dlv_Date - a.deal_date, 1, 1, 0)) t1,
Sum(Decode(c.Dlv_Date - a.deal_date, 2, 1, 0)) t2,
Sum(Decode(c.Dlv_Date - a.deal_date, 3, 1, 0)) t3,
Sum(Decode(c.Dlv_Date - a.deal_date, 4, 1, 0)) t4,
Sum(Decode(c.Dlv_Date - a.deal_date, 5, 1, 0)) t5
from tb_evt_bag_mail_rela a, tb_evt_dlv c, tb_jg d
where a.mail_num = c.mail_num
and a.bag_actn_code = '3'
and c.dlv_date between to_date('2014-6-1', 'yyyy-mm-dd') and
to_date('2014-6-1', 'yyyy-mm-dd')
and c.dlv_bureau_org_code = d.zj_code
and c.dlv_sts_code = 'I'
and d.jgfl = 'yz'
and (a.deal_date, a.deal_time) =
(select max(t.deal_date), max(t.deal_time)
from tb_evt_bag_mail_rela t
where t.mail_num = a.mail_num
and t.bag_actn_code = '3'
group by t.mail_num, t.bag_actn_code)
group by d.city, d.ssxs, d.zj_code, d.zj_mc
order by d.city, d.ssxs, d.zj_code

4、存在问题及解决

上面语句的查询结果出来后。经核对,数字对不上,记录变少了,差了非常多。检查发现有一部分邮件没有分发记录。只是这个数字非常少,那么原因出在哪儿呢?

原来原因出在最后一个条件上。最后一个条件是查出最大日期和最大时间。可是。最大日期的那条记录时间不一定最大,结果导致,这些邮件都被涮下去了。为了得到正确结果。最后一个条件改为:

   and to_char(a.deal_date,'yyyymmdd')||to_char(a.deal_time,'000000') =
(select max(to_char(t.deal_date,'yyyymmdd')||to_char(t.deal_time,'000000'))
from tb_evt_bag_mail_rela t
where t.mail_num = a.mail_num
and t.bag_actn_code = '3'
group by t.mail_num, t.bag_actn_code)

时间按格式“000000”转换是由于表中时间是时分秒组成的数值型字段,长度不定。按格式“000000”转换后统一长度,便于比較大小。比方日期时间合成结果:20140530 091239,就是2014年5月30日9时12分39秒。

select d.city, d.ssxs, d.zj_code, d.zj_mc, count(*) ttzl,
Sum(Decode(c.Dlv_Date - a.deal_date, 0, 1, 0)) t0,
Sum(Decode(c.Dlv_Date - a.deal_date, 1, 1, 0)) t1,
Sum(Decode(c.Dlv_Date - a.deal_date, 2, 1, 0)) t2,
Sum(Decode(c.Dlv_Date - a.deal_date, 3, 1, 0)) t3,
Sum(Decode(c.Dlv_Date - a.deal_date, 4, 1, 0)) t4,
Sum(Decode(c.Dlv_Date - a.deal_date, 5, 1, 0)) t5
from tb_evt_bag_mail_rela a, tb_evt_dlv c, tb_jg d
where a.mail_num = c.mail_num
and a.bag_actn_code = '3'
and c.dlv_date between to_date('2014-6-1', 'yyyy-mm-dd') and
to_date('2014-6-1', 'yyyy-mm-dd')
and c.dlv_bureau_org_code = d.zj_code
and c.dlv_sts_code = 'I'
and d.jgfl = 'yz'
and to_char(a.deal_date,'yyyymmdd')||to_char(a.deal_time,'000000') =
(select max(to_char(t.deal_date,'yyyymmdd')||to_char(t.deal_time,'000000'))
from tb_evt_bag_mail_rela t
where t.mail_num = a.mail_num
and t.bag_actn_code = '3'
group by t.mail_num, t.bag_actn_code)
group by d.city, d.ssxs, d.zj_code, d.zj_mc
order by d.city, d.ssxs, d.zj_code

最后须要说明一下。to_char按指定格式“000000”转换后,会在前面加上一个空格,只是这个不影响比較。to_char这个函数后面假设没有格式指定,转换后则没有空格,只是长度就是数字的实际长度了,要想统一长度。能够加上一个大数。比如,

to_char(t.deal_time+9000000)

转换结果:201405309091239

版权声明:本文博客原创文章,博客,未经同意,不得转载。

SQL:多表关联采取这一纪录迄今为止最大的更多相关文章

  1. 图解SQL多表关联查询

      图解SQL多表关联查询     网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习  内连接     左连接     右连接       全外连接   1. 查两表关联列相等的数据 ...

  2. SQL Server表关联

    表关联:Hash.Nested Loops.Merge.这是实际算法,不是T-SQL中的inner/left/right/full/cross join.优化器会把这些T-SQL写法转换成上面的3种算 ...

  3. SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响

    现有两表A(大).B(小)作关联查询,SQL语句如下: SQL1:select * from A,B where A.id = B.id SQL2:select * from A,B where B. ...

  4. PL/SQL 多表关联UPDATE

    假设有两个表A和B,A表字段a,b,c,d,B表字段b,e,f,两表的关联条件是字段b,现在想做个data patch,欲将B表中的字段e的值patch给A表的字段c. 有如下两种方法: 1 upda ...

  5. SQL多表关联查询

        在创建关系型数据表时,根据数据库范式的要求,为了降低数据的冗余,提供数据维护的灵活性 将数据分成多个表进行存储,实际工作当中,需要多个表的信息,需要将多个表合并显示   --内连接 selec ...

  6. sql多表关联

    inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有 ...

  7. sql -- 多表关联,update(用户奖励)

    表设计: users_buy: users_score: 需求: 1.根据用户分组,找出用户消费最高的金额 select user_name, max(paymoney) as pm from use ...

  8. SQL语句分组排序,多表关联排序

    SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...

  9. Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

    在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...

随机推荐

  1. 【Unity3D】【NGUI】UILabel

    原文:http://www.tasharen.com/forum/index.php?topic=6706.0 NGUI讨论群:333417608 概述 UILabel是用来显示文本的脚本,继承自UI ...

  2. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

  3. android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用

    android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用,只要把Imageview的src给去掉就成了,src捕获了bac ...

  4. Handler和HandlerThread

    1.什么是Handler? SDK中关于Handler的说明例如以下: A Handler allows you to sendand process Messageand Runnable obje ...

  5. OpenCV五学习: 如何使用命令来启动或关闭OpenCV的CPU指令系统CV_SSE2,CV_SSSE4和其他优化

    在这个博客.我想分享一下OpenCV源代码CPU指令系统CV_SSE2和其他相关知识 一个.    CV_SSE系列指令集的预编译符号定义在opencv2/core/internal.hpp这个头文件 ...

  6. linux 查看某进程或程序的网卡流量(转)

    一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...

  7. web框架python

    22.python笔记之web框架   一.web框架本质 1.基于socket,自己处理请求 #!/usr/bin/env python3 #coding:utf8 import socket de ...

  8. [poj 2991]Crane[线段树表示向量之和,而非数量]

    题意: 起重机的机械臂, 由n段组成, 对某一些连接点进行旋转, 询问每次操作后的末端坐标. 思路: 由于旋转会影响到该点之后所有线段的角度, 因此容易想到用线段树记录角度, 成段更新. (但是不是每 ...

  9. iOS8:把这些七招APP哭

    6月3日.苹果发布了新一代的高配置手机操作系统iOS 8,我们看到了很多新的功能和引人注目的新变化.它为开发人员提供了许多其他更酷能力发展.第三方输入法也开放,这使得国内的百度.搜狗输入法是不过高兴的 ...

  10. JMX操作ActiveMQ(1)

    我们知道ActiveMQ broker的管理接口是通过JMX方式提供的. 一个简单的访问方式就是通过jconsole,输入 service:jmx:rmi:///jndi/rmi://localhos ...