[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