日期:2014-05-18  浏览次数:20797 次

求一个查询统计表(本人认为有点难度)
有两个表
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.