销售订单报表

有个销售订单数据如图:

image

报表要求如下:

image

SQL脚本如下:

create proc [dbo].[Tecul_sp_SaleOrderSumByMonth]
as
-- 本月数据
select 产品系列 as 产品系列, SUM( 金额) as 本月销售额, convert(varchar(6),订单日期,112) as 订单日期, 
CAST( convert(varchar(7),订单日期,120)+'-1' as datetime) as 当月第一天
into #t
from tecul_vw_saleorder 
group by convert(varchar(6),订单日期,112),产品系列,convert(varchar(7),订单日期,120)
--去年同月数据
select t3.产品系列 as 产品系列,ISNULL( t3.本月销售额,0) as 上年同月销售额,t4.订单日期 as 月份,t4.当月第一天 as 当月第一天
into #tt
from #t t3 
join #t t4 on t3.产品系列=t4.产品系列 and t3.当月第一天= DATEADD(YEAR,-1,t4.当月第一天)
--汇总数据
select b1.产品系列 as 产品系列,DATEPART(YEAR,b1.当月第一天) as 年,DATEPART(MONTH,b1.当月第一天)as 月
,ISNULL( b1.本月销售额,0) as 本月销售额,ISNULL( b2.上年同月销售额,0) as 上年同月销售额,ISNULL( b3.上月销售额,0) as 上月销售额
,ISNULL( b4.去年同期销售额,0) as 去年同期销售额,ISNULL( b5.本年同期销售额,0) as 本年同期销售额 , 
case when ISNULL( b3.上月销售额,0)=0 then '' else
cast( cast( (ISNULL( b1.本月销售额,0)-ISNULL( b3.上月销售额,0))*100/ b3.上月销售额 as decimal(10,2) ) as varchar(50))+'%' end as '同上月比(%)',
case when ISNULL(b2.上年同月销售额,0)=0 then '' else
cast( cast( (ISNULL( b1.本月销售额,0)-ISNULL( b2.上年同月销售额,0))*100/ b2.上年同月销售额 as decimal(10,2) ) as varchar(50))+'%' end as '同上年同月比(%)',
case when ISNULL(b4.去年同期销售额,0)=0 then '' else
cast( cast( (ISNULL( b5.本年同期销售额,0)-ISNULL( b4.去年同期销售额,0))*100/ b4.去年同期销售额 as decimal(10,2) ) as varchar(50))+'%' end as '同上年同月比(%)'
from
--本月数据
#t b1 
--去年同月数据
left join #tt b2 on b1.产品系列=b2.产品系列 and b1.当月第一天=b2.当月第一天  
--上月数据
left join
(
select t1.产品系列 as 产品系列, ISNULL( t1.本月销售额,0) as 上月销售额,t2.订单日期 as 月份,t2.当月第一天 as 当月第一天 from #t t1 
join #t t2 on t1.产品系列=t2.产品系列 and t1.当月第一天= DATEADD(MONTH,-1,t2.当月第一天)
) b3 on b1.产品系列=b3.产品系列 and b1.当月第一天=b3.当月第一天
--去年同期销售额
left join 
(   
select a1.*,( select SUM(a2.上年同月销售额) from #tt a2 where a2.当月第一天<=a1.当月第一天 and DATEPART(YEAR,a1.当月第一天)=DATEPART(YEAR,a2.当月第一天))as 去年同期销售额
from #tt a1
)b4 on b4.产品系列=b1.产品系列 and b4.当月第一天=b1.当月第一天
--本年同期销售额
left join
(
select a.产品系列,a.本月销售额,a.当月第一天,(select SUM(本月销售额) from #t as b where b.当月第一天<=a.当月第一天 and DATEPART(YEAR,b.当月第一天)=DATEPART(YEAR,a.当月第一天))as 本年同期销售额
from #t as a
)b5 on b1.产品系列=b5.产品系列 and b1.当月第一天=b5.当月第一天
--删除虚拟表
drop table #t
drop table #tt

 

posted @ 2016-08-19 14:40  田默心  阅读(3089)  评论(0编辑  收藏  举报