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框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...
随机推荐
- Delphi代码中嵌入ASM代码(简单明了)
前言 Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的 ...
- fastjson 之常见的数据类型与json的相互转换
public class FastJsonTest1 { /** * 数组转json格式字符串 */ public void array2Json(){ String[] arr = {"b ...
- Android - 隐藏最顶端的通知条(Top Notification Bar)
隐藏最顶端的通知条(Top Notification Bar/ActionBar) 本文地址: http://blog.csdn.net/caroline_wendy Android中, 视频播放等功 ...
- MySQL中同一时候存在创建和上次更新时间戳字段解决方法浅析
在写这篇文章之前.明白我的MySQL版本号. mysql> SELECT VERSION(); +------------+ | VERSION() | +------------+ | 5.5 ...
- go编程基础
可见性规则: go语言,根据函数名首字母大小写区分private,和pulic. 函数名首字母小写为private 函数名首字母大写为public
- Delphi接口的底层实现(接口在内存中仍然有其布局,它依附在对象的内存空间中,有汇编解释)——接口的内存结构图,简单清楚,深刻 good
引言 接口是面向对象程序语言中一个很重要的元素,它被描述为一组服务的集合,对于客户端来说,我们关心的只是提供的服务,而不必关心服务是如何实现的:对于服务端的类来说,如果它想实现某种服务,实现与该服务相 ...
- 第二章排错的工具:调试器Windbg(上)
感谢博主 http://book.51cto.com/art/200711/59731.htm <Windows用户态程序高效排错>第二章主要介绍用户态调试相关的知识和工具.本文主要讲了排 ...
- Cocos2d-x响应android返回键
开启按键按键监听 setKeypadEnabled(true); 重写监听事件函数 virtual void keyBackClicked(); 如: void BanQiuLayer::keyBac ...
- poj3461 Oulipo (KMP模板题~) 前面哪些也是模板题 O.O
# include <stdio.h> # include <algorithm> # include <string.h> using namespace std ...
- abap alv multiple header using write
A standard SAP ALV list report will show only one line header, but there will be a requirement somed ...