alter proc wfg_sp_T_Sales(@iYear int,@iPeriod int)
as
set nocount on
set ansi_warnings off
--虚拟表
drop table #tmp_data
drop table #tmp_data2create table #tmp_data(FID int identity(1,1),
benqish decimal(18,2),
baifen1 varchar(150),
benqisr decimal(18,2),
baifen2 varchar(150),
shangniansh1 decimal(18,2),
baifen3 varchar(150),
shangniansr1 decimal(18,2),
baifen4 varchar(150),
cha1 decimal(18,2),
cha2 decimal(18,2),
fregion decimal(150))
create table #tmp_data2(FID int identity(1,1),
benniansh decimal(18,2),
baifen5 varchar(150),
benniansr decimal(18,2),
baifen6 varchar(150),
shangniansh2 decimal(18,2),
baifen7 varchar(150),
shangniansr2 decimal(18,2),
baifen8 varchar(150),
cha3 decimal(18,2),
cha4 decimal(18,2),
fregion2 varchar(150))--定义本期数量金额,上年同期数量金额,本年累计数量金额,上年累计数量金额
declare @iQty decimal(18,2),@iAmt decimal(18,2),
        @iyQty decimal(18,2),@iyAmt decimal(18,2),
        @icQty decimal(18,2),@icAmt decimal(18,2),
        @iylQty decimal(18,2),@iylAmt decimal(18,2)
--定义上年同期数量金额(每个月)
--declare @iMQty decimal(18,2),@iMAmt decimal(18,2)
--赋值 本期数量金额
select @iQty=sum(fqty),@iAmt=sum(famt) from wfg_t_B_Detail_Basic where fyear=@iYear and fperiod=@iPeriod group by fRegion
--赋值 上年同期数量金额
select @iyQty=sum(fqty),@iyAmt=sum(famt) from wfg_t_B_Detail_Basic where fyear=@iYear-1 and fperiod=@iPeriod group by fRegion
--赋值 本年累计数量金额
select @icQty=sum(fqty),@icAmt=sum(famt) from wfg_t_B_Detail_Basic where fyear=@iYear and fperiod<=@iPeriod group by fRegion 
--赋值 上年累积数量金额
select @iylQty=sum(fqty),@iylAmt=sum(famt) from wfg_t_B_Detail_Basic where fyear=@iYear-1 and fperiod<=@iPeriod group by fRegion 
--销售比较
--放入虚拟表
insert into #tmp_data(benqish,baifen1,benqisr,baifen2,shangniansh1,baifen3,shangniansr1,baifen4,cha1,cha2,fregion)
        select sum(a.fqty),case when @iQty=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(a.fqty)/@iQty*100,2))))+'%' end ,
           sum(a.famt),case when @iAmt=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(a.famt)/@iAmt*100,2))))+'%' end ,
           b.fqty ,b.fQPer ,
           b.famt ,b.fAPer ,
           sum(a.fqty)-b.fqty ,
           sum(a.famt)-b.famt,
           a.FRegion
           from wfg_t_B_Detail_Basic a         
        left join       
           (select sum(fqty) fqty,case when @iyQty=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(fqty)/@iyQty*100,2))))+'%' end fQPer,
                   sum(famt) famt,case when @iyAmt=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(famt)/@iyAmt*100,2))))+'%' end fAPer,
                   FRegion
            from wfg_t_B_Detail_Basic where fyear=@iYear-1 and fperiod=@iPeriod group by FRegion,fqty,famt) b
         on a.FRegion=b.FRegion where a.fyear=@iYear and a.fperiod=@iPeriod group by a.FRegion,b.fqty,b.fQPer,b.famt,b.fAPer--放入虚拟表
insert into #tmp_data2(benniansh,baifen5,benniansr,baifen6,shangniansh2,baifen7,shangniansr2,baifen8,cha3,cha4,fregion2)
      --本年累积与上年累积数量收入及其差异
     (select sum(c.fqty) ,case when @icQty=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(c.fqty)/@icQty*100,2))))+'%' end ,
             sum(c.famt) ,case when @icAmt=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(c.famt)/@icAmt*100,2))))+'%' end ,
             d.fqty ,d.fQPer ,
             d.famt ,d.fAPer ,
             sum(c.fqty)-d.fqty ,
             sum(c.famt)-d.famt ,
             c.FRegion
             from wfg_t_B_Detail_Basic c         
      left join       
           (select sum(fqty) fqty,case when @iylQty=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(fqty)/@iylQty*100,2))))+'%' end fQPer,
                   sum(famt) famt,case when @iylAmt=0 then convert(varchar(100),0) else convert(varchar(200),(convert(decimal(18,2),round(sum(famt)/@iylAmt*100,2))))+'%' end fAPer,
                   FRegion
            from wfg_t_B_Detail_Basic where fyear=@iYear-1 and fperiod<=@iPeriod group by FRegion,fqty,famt) d
      on c.FRegion=d.FRegion where c.fyear=@iYear and c.fperiod<=@iPeriod group by c.FRegion,d.fqty,d.fQPer,d.famt,d.fAPer)
--整合虚拟表
select benqish '本期数量',baifen1'百分比',benqisr '本期收入',baifen2 '百分比',shangniansh1 '上年同期数量',baifen3 '百分比',shangniansr1 '上年同期收入',baifen4 '百分比',cha1 '差异数量',cha2 '差异收入',
       benniansh '本年累计数量',baifen5 '百分比',benniansr '本年累计收入',baifen6 '百分比',shangniansh2 '上年累积数量',baifen7 '百分比',shangniansr2 '上年累积收入',baifen8 '百分比',cha3 '差异数量',cha4 '差异收入',fregion2
         from #tmp_data a inner join #tmp_data2 b on a.fregion=b.fregion2exec wfg_sp_T_Sales 2010,8 执行后报错消息 2750,级别 16,状态 1,过程 wfg_sp_T_Sales,第 11 行
第 12 个列或参数: 指定的列精度 150 大于最大精度 38。高手指教 谢谢

解决方案 »

  1.   

    fregion decimal(150)
      

  2.   

    create table #tmp_data(FID int identity(1,1),
    benqish decimal(18,2),
    baifen1 varchar(150),
    benqisr decimal(18,2),
    baifen2 varchar(150),
    shangniansh1 decimal(18,2),
    baifen3 varchar(150),
    shangniansr1 decimal(18,2),
    baifen4 varchar(150),
    cha1 decimal(18,2),
    cha2 decimal(18,2),
    fregion decimal(150))--这里错了,decimal最大38位,你定义错了,可能是varchar(150)