SQL:多表关联采取这一纪录迄今为止最大
笔者: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:多表关联采取这一纪录迄今为止最大的更多相关文章
- 图解SQL多表关联查询
图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习 内连接 左连接 右连接 全外连接 1. 查两表关联列相等的数据 ...
- SQL Server表关联
表关联:Hash.Nested Loops.Merge.这是实际算法,不是T-SQL中的inner/left/right/full/cross join.优化器会把这些T-SQL写法转换成上面的3种算 ...
- SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
现有两表A(大).B(小)作关联查询,SQL语句如下: SQL1:select * from A,B where A.id = B.id SQL2:select * from A,B where B. ...
- PL/SQL 多表关联UPDATE
假设有两个表A和B,A表字段a,b,c,d,B表字段b,e,f,两表的关联条件是字段b,现在想做个data patch,欲将B表中的字段e的值patch给A表的字段c. 有如下两种方法: 1 upda ...
- SQL多表关联查询
在创建关系型数据表时,根据数据库范式的要求,为了降低数据的冗余,提供数据维护的灵活性 将数据分成多个表进行存储,实际工作当中,需要多个表的信息,需要将多个表合并显示 --内连接 selec ...
- sql多表关联
inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有 ...
- sql -- 多表关联,update(用户奖励)
表设计: users_buy: users_score: 需求: 1.根据用户分组,找出用户消费最高的金额 select user_name, max(paymoney) as pm from use ...
- SQL语句分组排序,多表关联排序
SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...
- Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询
在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...
随机推荐
- sofa-pbrpc 1.1.1 发布,RPC 网络通信库
https://www.oschina.net/news/77372/sofa-pbrpc-1-1-1 https://www.oschina.net/p/sofa-pbrpc
- Android应用开发学习笔记之绘图
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一.绘图常用类介绍 在Android中绘图时,常用到的几个类是Paint.Canvas.Bitmap和Bitmapt ...
- Linux Shell 之 Shell中的函数调用
说起函数调用,相信大家也不会陌生,然而对于初学Shell的我来说,Shell中函数调用方式却有点让我不太习惯,自己也走了不少的弯路,因为传递参数时出了一个很“自然”的错误,也让我吃了不少的苦头,所以总 ...
- cocos2d-x 3.0 使用最新物理引擎的一个源代码实例
1.碰撞函数參数由两个变成一个了 2.检測不到碰撞.须要设置那三个參数.同一时候还要设置成动态的. body进行设置. 3.初始入口文件也发生了改变. 附录上我近期调试好的cocos2d-x 3.1 ...
- Maven 建 Struts2 基本实现 CURD Controller
开发环境 开发工具:Eclipse 数据库:MySQL server:Tomcat Struts2 请求原理流程图 构建一个 web maven project,在pom.xml引入struts2的j ...
- Raphaël 中文帮助文档(API)
http://html5css3webapp.com/raphaelApi.htm
- SUSE Linux 报错:too many open files in system
现网执行的oracle数据库,有一天突然报错(alert日志):too many open files in system,须要对操作系统同意句柄数进行扩充,查阅了非常多资料,改动点主要集中在例 ...
- COCO-Android开发框架公布
一. COCO-Android说明 二. COCO-Android结构图 三. COCOBuild 四. COCOFrame 一.COCO-Android说明 1. COCO-Android是支撑An ...
- 恢复gvim的ctl+v可视模式设置
set nocompatiblesource $VIMRUNTIME/vimrc_example.vim"source $VIMRUNTIME/mswin.vim (注释此行)behave ...
- poj1655(树形dp)
题目链接:http://poj.org/problem?id=1655 题目大意:给一个树,删除其中一个点就会形成一个森林,点的平衡度为删除了这个节点后,所形成多个树,其中组成树的节点最多,节点个数就 ...