又是在QQ群上收到的问题。
哪位同仁能否给我一条查询某条分配台帐的首止年月是跨年度的命令
同样是思路:
1、判断是不是同一年度,要找出缴费月属于哪个年度,好在有个整理表,其中有各个月份对应的年度。这里先加上一个单位过滤条件。
SELECT t.ROWID AS ID,0 AS jzz,nd AS jzs FROM zl_nynd,fp_zgfptz t WHERE ny=zgf_jzsny AND zgf_qydm=6667;这是记账始的
这是记账止的
SELECT t.ROWID AS ID,nd AS jzz,0 AS jzs FROM zl_nynd,fp_zgfptz t WHERE ny=zgf_jzzny AND zgf_qydm=6667;
这里写了三个字段,rowid(用于判定是同一个分配台账),jzz(记账止年度),jzs(记账始年度)
2、再将这两个表合并起来,形成一个新表,再对这个新表按ROWID进行分组相加,并对jzz和jzs 进行比较,看看是不是相等,如果是想等的就是同一年度,不等就不是同一年度了。
最后语句:
SELECT * FROM fp_zgfptz B WHERE B.ROWID IN
(
SELECT ID FROM
(SELECT ID ,SUM(jzz),SUM(jzs),SUM(jzz)-SUM(jzs) AS ok
FROM
(SELECT t.ROWID AS ID,0 AS jzz,nd AS jzs FROM zl_nynd,fp_zgfptz t WHERE ny=zgf_jzsny AND zgf_qydm=6667
UNION ALL
SELECT t.ROWID AS ID,nd AS jzz,0 AS jzs FROM zl_nynd,fp_zgfptz t WHERE ny=zgf_jzzny AND zgf_qydm=6667)
GROUP BY ID)
WHERE ok<>0
);
另有强人写了下面的语句:
select t.zgf_qydm "单位编码",t.zgf_fzh "辅助号",t.zg_shbzh "身份证号",t.zg_xm "姓名",t.zgf_jkrq "缴款日期" from (
select a.zgf_qydm,a.zgf_fzh,b.zg_shbzh,b.zg_xm,a.zgf_jkrq
from fp_zgfptz a,da_zgjbqk b
where a.zgf_fzh=b.zg_fzh and substr(zgf_jzsny,5,2)<7 and substr(zgf_jzzny,5,2)>6 and substr(zgf_jzsny,1,4)>=1999 and b.flag in (0,-1)
union all
select a.zgf_qydm,a.zgf_fzh,b.zg_shbzh,b.zg_xm,a.zgf_jkrq
from fp_zgfptz a,da_zgjbqk b
where a.zgf_fzh=b.zg_fzh and substr(zgf_jzsny,5,2)>=7 and substr(zgf_jzzny,5,2)>6
and substr(zgf_jzsny,1,4)<>substr(zgf_jzzny,1,4)
and substr(zgf_jzsny,1,4)>=1999 and b.flag in (0,-1)) t order by t.zgf_qydm,t.zgf_fzh,t.zgf_jkrq;
可是据测试说没有判断出200701-200903这样的数据。仔细看了下上面的语句,发现人家分析的不错,将跨年度分为了几种情况:
1、起始小于7月终止大于6月的(如200904-200907)
2、起始大于等于7月终止大于6 而又不是同一自然年的(200907-201007)
但是少了起始大于6终止小于7而终止减起始年份不等于1的,应该还有几种情况吧,少一种都不行呀!
发现自己写了代码,再看下别人实现同一功能的代码,更能发现从另一种角度看问题的方法。