求一个查询统计表(本人认为有点难度)
有两个表 
 select   ps_no,itm,pshk,psdat   from   tf_pss_z 
 ps_no-> varchar(20),not   null;itm      -> smallint,not   null 
 pshk   -> numeric(28,8),null;psdat-> datetime,null   
 select   ps_no,itm,prd_no,ps_dd,qty,amt   from   tf_pss 
 ps_no-> varchar(20),not   null;itm      -> smallint,not   null;ps_dd-> datetime,null 
 qty      -> numeric(28,8);amt      -> numeric(28,8)   
 --查询条件为:从PS_DD   至   PS_DD   并且   PRD_NO 
       (上面查询条件的PS_DD起始与终止的PS_DD查询都在同一年月) 
 select    
 t.prd_no, 
 qty1=sum(t.qty), 
 amt1=sum(t.amt), 
 pshk1=sum(z.pshk), 
 bywsk=sum(t.amt)-sum(z.pshk), 
 ----(上面都是按PS_DD日期范围(between)之内查找, 
 并且ps_dd的年月与psdat年月相同而得到的值);   
 byqwsk=--这里得到查询PS_DD日期之前sum(t.amt)-sum(z.pshk)> =0的所有值, 
 yqpshk=--这里得到表tf_pss_z里PSDAT年月等于查询范围ps_dd 
                            的年月,并对应内容的PS_DD在查询条件PS_DD之月份的sum(pshk), 
 from   tf_pss   t   left   join   tf_pss_z   z   on   t.itm=z.itm   and   t.ps_no=z.ps_no   and    
 group   by   t.prd_no     
 难度在于byqwsk\yqpshk这两个和计如何可以求出来!请帮帮忙
------解决方案--------------------帖出数据、结果。最好把字段含义也说一下。
------解决方案--------------------select  
     t.prd_no, 
     qty1  =sum(case t.PS_DD between @DD1 and @DD2 then t.qty        else 0 end), 
     amt1  =sum(case t.PS_DD between @DD1 and @DD2 then t.amt        else 0 end), 
     pshk1 =sum(case t.PS_DD between @DD1 and @DD2 then z.pshk       else 0 end), 
     bywsk =sum(case t.PS_DD between @DD1 and @DD2 then t.amt-z.pshk else 0 end), 
     byqwsk=sum(case t.PS_DD  < @DD1 then t.amt-z.pshk else 0 end) , 
     yqpshk=sum(pshk) 
 from  
     tf_pss t  
 left join  
     tf_pss_z z  
 on  
     t.itm=z.itm  
     and  
     t.ps_no=z.ps_no  
 group by  
     t.prd_no
------解决方案----------------------定义一个函数用来求一段时间所有产品对应的金额、回款额、未回款额。 
 --‘s_’是指销售的时间,‘f_’是指回款的时间 
 --,如果没有限制就 '19000101 '~getdate() 
 create function f_get(s_begin_date datetime,s_end_date datetime 
                   ,f_begin_date datetime,f_end_date datetime) 
 returns table 
 as 
 begin 
 return( 
       select prd_no,sum(QTY)as 数量,sum(amt)as 金额  
             ,z.回款额,sum(amt)-z.回款额 as 未回款额 
       from tf_pss s 
       join( 
             select prd_no,sum(pshk) as 回款额 
             from tf_pss_z z 
             join tf_pss s on s.ps_no = z.ps_no 
             where s.ps_dd between s_begin_date and s_end_date 
                   and z.psdat between f_begin_date and f_end_date 
             group by prd_no 
       ) z on z.prd_no = s.prd_no 
       where s.ps_dd between s_begin_date and s_end_date 
       group by s.prd_no,z.回款额 
 ) 
 end   
 --根据时间的范围的要求确定需要几个f_get() 
 select *  
 from f_get(……)a--这个用来查 销售数量 金额 回款额 
 join f_get(……)b 
 ……
------解决方案--------------------mark.