有個銷售訂單數據如圖:
報表要求如下:
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