有一个表,名为X1,字段为纳税人识别号NSRSBH、所属时期SSSQ、应纳税额YNSE、上期留抵税额SQLDSE.每户纳税人每月一条记录。我要获得一个记录集,内容是某年内每户纳税人应纳税额总和和上期留抵税额,而上期留抵税额就是该纳税人本年最早一个月的上期留抵税额。这样明显不行:Select NSRSBH,SUM(YNSE) T_YNSE,MIN(SQLDSE) M_SQLDSE from X1 WHERE SSSQ between '2004-1-1' and '2004-12-31' group by NSRSBH 那么该怎样写呢?

解决方案 »

  1.   

    Select NSRSBH,SUM(YNSE) T_YNSE, sum(case datepart(SSSQ,month) when 1 then SQLDSE else 0 end) from X1 WHERE SSSQ between '2004-1-1' and '2004-12-31' group by NSRSBH
      

  2.   

    上面的语句是基于“每户纳税人每月一条记录”,也就是认为一月份必有一条记录才有用,如果不是,那么可能就要用下面比较麻烦的写法
    select * from (
    Select NSRSBH,SUM(YNSE) T_YNSE from X1 WHERE SSSQ between '2004-1-1' and '2004-12-31' group by NSRSBH ) t1 inner join 
    (
    select * from (
    Select NSRSBH,Min(SSSQ) T_Date from X1 WHERE SSSQ between '2004-1-1' and '2004-12-31' group by NSRSBH ) t0 inner join x1 on t0.NSRSBH=x1.NSRSBH and t0.T_Date=x1.SSSQ
    ) t2 on t1.NSRSBH=t2.NSRSBH 还没考虑性能,要把它优化一下
      

  3.   

    没有考虑日期范围,写出的语句如下,并测试通过(加上了期末留抵税额QMLDSE),好可怕呀,不知能不能优化。select C0.*,C1.SQLDSE,C2.QMLDSE from 
    (select NSRSBH,SUM(YNSE) T_YNSE from X1 group by NSRSBH) C0,
    (select X1.NSRSBH,SQLDSE from X1,(select NSRSBH,MIN(SSSQ) ZRQ from X1 group by NSRSBH) t1 where X1.NSRSBH=t1.NSRSBH and SSSQ=ZRQ) C1,
    (select X1.NSRSBH,QMLDSE from X1,(select NSRSBH,MAX(SSSQ) ZRQ from X1 group by NSRSBH) t2 where X1.NSRSBH=t2.NSRSBH and SSSQ=ZRQ) C2
    where C0.NSRSBH=C1.NSRSBH and C0.NSRSBH=C2.NSRSBH
      

  4.   

    如果觉得上面的语句比较可怕,那么除了考虑SQL性能优化之外,还应该从数据结构上考虑一下;系统是否经常关心年度的期出/期末留抵税额?如果是,那么数据结构必须调整,如果不是,那么一年恐怕只使用几次的报表查询,效率低一点又有什么大碍...