笔者:iamlasong

1、需求

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

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

2、明细查询

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

  1. select d.city,d.ssxs,d.zj_code,d.zj_mc,c.mail_num,
  2. c.dlv_date,to_char(c.dlv_time,'hh24miss'), c.actual_goods_fee,
  3. c.dlv_pseg_code,c.dlv_pseg_name,c.dlv_bureau_name,
  4. c.dlv_staff_code,c.dlv_staff_name,c.signer_name,
  5. a.deal_org_code,a.dlv_org_code,a.label_strip,a.deal_date,a.deal_time
  6. from tb_evt_bag_mail_rela a, tb_evt_dlv c, tb_jg d
  7. where a.mail_num = c.mail_num
  8. and a.bag_actn_code = '3'
  9. and c.dlv_date between to_date('2014-6-1', 'yyyy-mm-dd') and
  10. to_date('2014-6-1', 'yyyy-mm-dd')
  11. and c.dlv_bureau_org_code = d.zj_code
  12. and c.dlv_sts_code = 'I'
  13. and d.jgfl = 'yz'
  14. and (a.deal_date, a.deal_time) =
  15. (select max(t.deal_date), max(t.deal_time)
  16. from tb_evt_bag_mail_rela t
  17. where t.mail_num = a.mail_num
  18. and t.bag_actn_code = '3'
  19. group by t.mail_num, t.bag_actn_code)

3、时限分布

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

  1. select d.city, d.ssxs, d.zj_code, d.zj_mc, count(*) ttzl,
  2. Sum(Decode(c.Dlv_Date - a.deal_date, 0, 1, 0)) t0,
  3. Sum(Decode(c.Dlv_Date - a.deal_date, 1, 1, 0)) t1,
  4. Sum(Decode(c.Dlv_Date - a.deal_date, 2, 1, 0)) t2,
  5. Sum(Decode(c.Dlv_Date - a.deal_date, 3, 1, 0)) t3,
  6. Sum(Decode(c.Dlv_Date - a.deal_date, 4, 1, 0)) t4,
  7. Sum(Decode(c.Dlv_Date - a.deal_date, 5, 1, 0)) t5
  8. from tb_evt_bag_mail_rela a, tb_evt_dlv c, tb_jg d
  9. where a.mail_num = c.mail_num
  10. and a.bag_actn_code = '3'
  11. and c.dlv_date between to_date('2014-6-1', 'yyyy-mm-dd') and
  12. to_date('2014-6-1', 'yyyy-mm-dd')
  13. and c.dlv_bureau_org_code = d.zj_code
  14. and c.dlv_sts_code = 'I'
  15. and d.jgfl = 'yz'
  16. and (a.deal_date, a.deal_time) =
  17. (select max(t.deal_date), max(t.deal_time)
  18. from tb_evt_bag_mail_rela t
  19. where t.mail_num = a.mail_num
  20. and t.bag_actn_code = '3'
  21. group by t.mail_num, t.bag_actn_code)
  22. group by d.city, d.ssxs, d.zj_code, d.zj_mc
  23. order by d.city, d.ssxs, d.zj_code

4、存在问题及解决

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

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

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

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

  1. select d.city, d.ssxs, d.zj_code, d.zj_mc, count(*) ttzl,
  2. Sum(Decode(c.Dlv_Date - a.deal_date, 0, 1, 0)) t0,
  3. Sum(Decode(c.Dlv_Date - a.deal_date, 1, 1, 0)) t1,
  4. Sum(Decode(c.Dlv_Date - a.deal_date, 2, 1, 0)) t2,
  5. Sum(Decode(c.Dlv_Date - a.deal_date, 3, 1, 0)) t3,
  6. Sum(Decode(c.Dlv_Date - a.deal_date, 4, 1, 0)) t4,
  7. Sum(Decode(c.Dlv_Date - a.deal_date, 5, 1, 0)) t5
  8. from tb_evt_bag_mail_rela a, tb_evt_dlv c, tb_jg d
  9. where a.mail_num = c.mail_num
  10. and a.bag_actn_code = '3'
  11. and c.dlv_date between to_date('2014-6-1', 'yyyy-mm-dd') and
  12. to_date('2014-6-1', 'yyyy-mm-dd')
  13. and c.dlv_bureau_org_code = d.zj_code
  14. and c.dlv_sts_code = 'I'
  15. and d.jgfl = 'yz'
  16. and to_char(a.deal_date,'yyyymmdd')||to_char(a.deal_time,'000000') =
  17. (select max(to_char(t.deal_date,'yyyymmdd')||to_char(t.deal_time,'000000'))
  18. from tb_evt_bag_mail_rela t
  19. where t.mail_num = a.mail_num
  20. and t.bag_actn_code = '3'
  21. group by t.mail_num, t.bag_actn_code)
  22. group by d.city, d.ssxs, d.zj_code, d.zj_mc
  23. order by d.city, d.ssxs, d.zj_code

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

  1. 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. rsync Backups for Windows

    Transfer your Windows Backups to an rsync server over SSH rsync.net provides cloud storage for offsi ...

  2. Swift - 判断设备类型开发兼容的iOS应用(iPad使用分隔视图控制器)

    1,分割视图控制器(UISplitViewController) 在iPhone应用中,使用导航控制器由上一层界面进入下一层界面. 但iPad屏幕较大,通常使用SplitViewController来 ...

  3. svn强制用户提交时写日志

    #!/bin/sh REPOS="$1" TXN="$2" SVNLOOK=/usr/bin/svnlook #根据你的SVN目录而定 LOGMSG=`$SVN ...

  4. SystemParametersInfo API学习(128个中文参数解释,215个实际值)

    uiAction:该参数指定要查询或设置的系统级参数.其取值如下:SPI_GETACCESSTIMEOUT:检索与可访问特性相关联的超时段的信息,PvParam参数必须指向某个ACCESSTIMEOU ...

  5. 检测用户是否具有administrator权限(OpenThreadToken,OpenProcessToken,GetTokenInformation,AllocateAndInitializeSid和EqualSid)

    检测用户是否具有administrator权限const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0 ...

  6. 五、Linux/UNIX操作命令积累【cp、mv、cat、grep、ps】

    在使用Linux/UNIX下,常常会使用文本界面去设置系统或操作系统,作者本人在工作的过程也在不断接触这方面的命令,所以为此特酝酿.准备.開始了本文的编写.本文主要记录自己平时遇到的一些Linux/U ...

  7. 承载于以太网帧之上的数据包的解析——ARP、IPv4、IPv6

    承接上一博文而来,继续解析网络数据包,对于承载在以太网上的三种协议进行了解析,主要是分为依据RFC定义的标准先解析头部数据,然后得到有效载荷,即为协议包括的实体数据,更上层进行进一步处理. 一.ARP ...

  8. RGB與CIELAB色彩空間轉換

    原地址:http://cg2010studio.wordpress.com/2012/10/02/rgb與cielab色彩空間轉換/ 之前有研究CIE L*a*b*色彩空間,現在想更進一步探討RGB色 ...

  9. Patch to solve sqlite3_int64 error when building Python 2.7.3 on RHEL/CentOS

    Patch to solve sqlite3_int64 error when building Python 2.7.3 on RHEL/CentOS Patch to solve sqlite3_ ...

  10. Heritrix与Nutch对比

    Nutch 开发语言:Java http://lucene.apache.org/nutch/ 简介: Apache的子项目之一,属于Lucene项目下的子项目. Nutch是一个基于Lucene,类 ...