有个销售订单数据如图:
报表要求如下:
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