ybc

 

一句简单的insert_select的Sql语句让我罗嗦了半天

[1] insert into adm_hg_ybqysk_yr
[2]   (id_qutr,id_taxp,id_swjg,id_gbhy,id_jyhy,id_zclx,id_zsfs,id_sz,mny_jrk_yr,mny_jrk_lyr)
[3]   select @qutrid@,a.id_taxp,a.id_swjg,a.id_gbhy,a.id_jyhy,a.id_zclx,a.id_zsfs,substring(b.id_sm,1,2),
[4]    sum(case when b.id_mth = @monthid@ then mny_rk_tyr else 0 end),
[5]   sum(case when b.id_mth = @lastymonthid@ then mny_rk_tyr else 0 end)
[6]  
[7]   from adm_hg_sntqybqy a,aam_sk_nsrsk_ssqz b
[8]   where a.id_taxp = b.id_taxp
[9]    and a.id_qutr = @qutrid@ and b.id_mth in(@monthid@,@lastymonthid@)
[10]    and substring(b.id_sm,1,2) < = '51'
[11]   group by @qutrid@,a.id_taxp,a.id_swjg,a.id_gbhy,a.id_jyhy,a.id_zclx,a.id_zsfs,substring(b.id_sm,1,2)


  这条sql都干些什么了,注意其中的@qutrid@,@monthid@,@lastmonthid@都是外部传入的时间参数值,有点英文底子的应该能看懂,这里我就不解释了,呵呵^&^,但是请注意了,这几个常量之间是有关系的,我这里还是说下吧。比如传进来的时间是08年1月份,那么这几个参数值分别为
  @qutrid@=2008一季度(当然这里可以编个号如20081301便于程序处理),
  @monthid@=200801,
  @lastmonthid@=200701,很简单吧

  一共十二行,还好不是很多哦,他其实就是做了次汇总,然后插到表中。

  [1][2][3]行不用介绍,用select的方式只直接insert

  [4][5] sum集合函数的汇总语句里面有个case when的条件语句判断

  [7][8] a表和b表通过id_taxp字段关联,取得两张表的交集,是不是啊?

  [9]  用a表字段的id_qutr和b表的id_mth设置过滤(具体的讲,就是a表中取是当前季度值的记录,b表中取是当前月或是去年同期的记录值)

  [10] 再次限定b表的取值范围,这么简单不说也罢

  [11] 终于改结束了,这是惯例,用sum()加一些非聚合运算的字段,就必须把这些字段放在group by里,不然会有什么后果,不说你也明白


  最后我再来此总结,不要嫌我罗嗦啊。

  这个Sql语句的要做到的事情是:取a表的季度值是@qutrid@的记录,取表的月份值是@qutrid@或@lastymonthid@的记录,再来就substring(b.id_sm,1,2) < = '51'过滤更多的记录,剩下的两表记录以id_taxp做了join,可以说经过了四次过滤,接下来再对剩余b表记录做sum(case... when...)的汇总(即当前月的mny_rk_tyr字段值都累加,去年同期的mny_rk_tyr也累加在一起),想想每个季度,它是要做三次这样的汇总的,为什么呢?一个季度有三个月。是不是很简单啊。最后把汇总的记录值插入到目标表,就万事大吉了,我也该洗洗睡了, 2008-3-27 22:16

posted on 2008-03-28 09:24 ybc 阅读(351) 评论(0)  编辑  收藏 所属分类: DATABASE


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜