我有一段代码,一般使用视图来直接实现,但里面的涉及到的日期判断值,每周都需要变化一次,也就需要自己每周都手动修改一次,这样搞来搞去,很容易出错误,请问能不能用存储过程来替代一下代码?.用变量来实现动态赋值查询?如果可以实现的话, 请高手给出存储过程详尽代码,谢谢!
select 
 分析目标.客户名称, 
---------------------------------全年情况---------------------------------
---------------------------------------------------------------------------
 分析目标.[2010年任务] as [2010年任务],
 回款2010数据.金额 as [2010年已完成],
 (ISNULL(回款2010数据.金额,1)/分析目标.[2010年任务]) as [2010年完成率],
 回款2009NZZ数据.金额 as [2009年8月全年完成], 
 ((ISNULL(回款2010NZZ数据.金额,0)-ISNULL(回款2009NZZ数据.金额,1))/回款2009NZZ数据.金额) as [2010年增长率],
 
---------------------------------当前季度情况------------------------------
--------------------------------------------------------------------------- (分析目标.[2010年任务]*0.22) as [Q3任务],
 回款2010Q3数据.金额 as [Q3已完成],
 (ISNULL(回款2010Q3数据.金额,1)/(分析目标.[2010年任务]*0.22)) as [Q3完成率],
 (ISNULL(回款2010Q3数据.金额,0)-(分析目标.[2010年任务]*0.22)) AS [Q3差额],---------------------------------本月情况---------------------------------
---------------------------------------------------------------------------
 (分析目标.[2010年任务]*0.073) as [8月任务(比重7.3%)],
 回款2009Y8数据.金额 as [2009年8月完成],
 回款2010Y8数据.金额 as [2010年8月已完成],
 (ISNULL(回款2010Y8数据.金额,1)/(分析目标.[2010年任务]*0.073)) AS [8月完成率],
 (ISNULL(回款2010Y8数据.金额,0)-(分析目标.[2010年任务]*0.084)) AS [8月差额],---------------------------------上月情况---------------------------------
--------------------------------------------------------------------------- (分析目标.[2010年任务]*0.084) as [7月任务(比重8.4%)],
 回款2009Y7数据.金额 as [2009年7月完成],
 回款2010Y7数据.金额 as [2010年7月已完成],
 (ISNULL(回款2010Y7数据.金额,1)/(分析目标.[2010年任务]*0.084)) AS [7月完成率],
 ((ISNULL(回款2010Y7数据.金额,0)-ISNULL(回款2009Y7数据.金额,1))/ISNULL(回款2009Y7数据.金额,1)) as [同期增长],
 (ISNULL(回款2010Y7数据.金额,0)-(分析目标.[2010年任务]*0.084)) AS [7月差额]
 
---------------------------------实现过程---------------------------------
---------------------------------------------------------------------------
from 分析目标--2010年回款计算
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2010-1-2') AND (回款数据.订货日期 <= '2010-12-31') GROUP BY 回款数据.客户名称) as 回款2010数据 
ON 分析目标.客户名称=回款2010数据.客户名称--2009回款计算(2009)--用于计算截止日期的增长率
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2009-1-2') AND (回款数据.订货日期 <= '2009-08-16') GROUP BY 回款数据.客户名称) as 回款2009NZZ数据 
ON 分析目标.客户名称=回款2009NZZ数据.客户名称--2010回款计算(2010)--用于计算截止日期的增长率
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2010-1-2') AND (回款数据.订货日期 <= '2010-08-16') GROUP BY 回款数据.客户名称) as 回款2010NZZ数据 
ON 分析目标.客户名称=回款2010NZZ数据.客户名称--季度回款计算(Q3)
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2010-7-1') AND (回款数据.订货日期 <= '2010-09-30') GROUP BY 回款数据.客户名称) as 回款2010Q3数据 
ON 分析目标.客户名称=回款2010Q3数据.客户名称
--8月回款计算(2009)
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2009-8-1') AND (回款数据.订货日期 <= '2009-08-16') GROUP BY 回款数据.客户名称) as 回款2009Y8数据 
ON 分析目标.客户名称=回款2009Y8数据.客户名称--8月回款计算(2010)
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2010-8-1') AND (回款数据.订货日期 <= '2010-08-16') GROUP BY 回款数据.客户名称) as 回款2010Y8数据 
ON 分析目标.客户名称=回款2010Y8数据.客户名称--7月回款计算(2009)
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2009-7-1') AND (回款数据.订货日期 <= '2009-7-31') GROUP BY 回款数据.客户名称) as 回款2009Y7数据 
ON 分析目标.客户名称=回款2009Y7数据.客户名称--7月回款计算(2010)
LEFT OUTER JOIN
(SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
WHERE (回款数据.订货日期 > '2010-7-1') AND (回款数据.订货日期 <= '2010-7-31') GROUP BY 回款数据.客户名称) as 回款2010Y7数据 
ON 分析目标.客户名称=回款2010Y7数据.客户名称

解决方案 »

  1.   

    由于不了解你的业务情况,所以也就比较难下手了。
    不过可以结合动态的SQL 语句以及时间函数getdate()、year()、month()等来动态的赋值进行查询每周变化一次,但是好像代码中没有涉及到周的。
      

  2.   

    以下为参考代码,子查询别名改为简单的英文更好理解,另:如果为1月可能有问题
    create proc p_query1 
    @curdate datetime
    as
    declare @sql nvarchar(max)
    declare @year int,@month int,@day int
    select @year=year(@curdate),@month=month(@curdate),@day=day(@curdate)  --取年月日set @sql='select 
     分析目标.客户名称,
    /*---------------------------------全年情况---------------------------------*/
     分析目标.[2010年任务] as ['+str(@year,4)+'年任务],
     回款2010数据.金额 as ['+str(@year,4)+'年已完成],
     (ISNULL(回款2010数据.金额,1)/分析目标.[2010年任务]) as ['+str(@year,4)+'年完成率],
     回款2009NZZ数据.金额 as ['+str(@year-1,4)+'年'+ltrim(str(@month))+'月全年完成], 
     ((ISNULL(回款2010NZZ数据.金额,0)-ISNULL(回款2009NZZ数据.金额,1))/回款2009NZZ数据.金额) as ['+str(@year-1,4)+'年增长率],
    /*---------------------------------当前季度情况------------------------------*/
     (分析目标.[2010年任务]*0.22) as [Q3任务],
     回款2010Q3数据.金额 as [Q3已完成],
     (ISNULL(回款2010Q3数据.金额,1)/(分析目标.[2010年任务]*0.22)) as [Q3完成率],
     (ISNULL(回款2010Q3数据.金额,0)-(分析目标.[2010年任务]*0.22)) AS [Q3差额],
    /*---------------------------------本月情况---------------------------------*/
     (分析目标.[2010年任务]*0.073) as ['+ltrim(str(@month))+'月任务(比重7.3%)],
     回款2009Y8数据.金额 as ['+str(@year-1,4)+'年'+ltrim(str(@month))+'月完成],
     回款2010Y8数据.金额 as ['+str(@year,4)+'年'+ltrim(str(@month))+'月已完成],
     (ISNULL(回款2010Y8数据.金额,1)/(分析目标.[2010年任务]*0.073)) AS ['+ltrim(str(@month))+'月完成率],
     (ISNULL(回款2010Y8数据.金额,0)-(分析目标.[2010年任务]*0.084)) AS ['+ltrim(str(@month))+'月差额],
    /*---------------------------------上月情况---------------------------------*/
     (分析目标.[2010年任务]*0.084) as ['+ltrim(str(@month-1))+'月任务(比重8.4%)],
     回款2009Y7数据.金额 as ['+str(@year-1,4)+'年'+ltrim(str(@month-1))+'月完成],
     回款2010Y7数据.金额 as ['+str(@year,4)+'年'+ltrim(str(@month-1))+'月已完成],
     (ISNULL(回款2010Y7数据.金额,1)/(分析目标.[2010年任务]*0.084)) AS ['+ltrim(str(@month-1))+'月完成率],
     ((ISNULL(回款2010Y7数据.金额,0)-ISNULL(回款2009Y7数据.金额,1))/ISNULL(回款2009Y7数据.金额,1)) as [同期增长],
     (ISNULL(回款2010Y7数据.金额,0)-(分析目标.[2010年任务]*0.084)) AS ['+ltrim(str(@month-1))+'月差额]
    /*---------------------------------实现过程---------------------------------*/
    from 分析目标
    /*--2010年回款计算*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+str(@year,4)+'-1-2'') AND (回款数据.订货日期 <= '''+str(@year,4)+'-12-31'') GROUP BY 回款数据.客户名称) as 回款2010数据 
    ON 分析目标.客户名称=回款2010数据.客户名称/*--2009回款计算(2009)--用于计算截止日期的增长率*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+str(@year-1,4)+'-1-2'') AND (回款数据.订货日期 <= '''+str(@year-1,4)+'-08-16'') GROUP BY 回款数据.客户名称) as 回款2009NZZ数据 
    ON 分析目标.客户名称=回款2009NZZ数据.客户名称/*--2010回款计算(2010)--用于计算截止日期的增长率*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+str(@year,4)+'-1-2'') AND (回款数据.订货日期 <= '''+convert(nvarchar(10),@curdate,120)+''') GROUP BY 回款数据.客户名称) as 回款2010NZZ数据 
    ON 分析目标.客户名称=回款2010NZZ数据.客户名称/*--季度回款计算(Q3)*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+str(@year,4)+'-'+case when @month in (1,2,3) then '1'
        when @month in (4,5,6) then '2' when @month in (7,8,9) then '7' else '10' end+'-1'') AND (回款数据.订货日期 <= '''+
    str(@year,4)+'-'+case when @month in (1,2,3) then '3-31' 
    when @month in (4,5,6) then '6-30' when @month in (7,8,9) then '9-30' else '12-31' end+''') GROUP BY 回款数据.客户名称) as 回款2010Q3数据 
    ON 分析目标.客户名称=回款2010Q3数据.客户名称
    /*--8月回款计算(2009)*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+@str(@year-1,4)+'-'+ltrim(str(@month))+'-1'') AND (回款数据.订货日期 <= '''+
     str(@year-1,4)+'-'+ltrim(str(@month))+'-'+ltrim(str(@day))+''') GROUP BY 回款数据.客户名称) as 回款2009Y8数据 
    ON 分析目标.客户名称=回款2009Y8数据.客户名称/*--8月回款计算(2010)*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+@str(@year,4)+'-'+ltrim(str(@month))+'-1'') AND (回款数据.订货日期 <= '''+
    str(@year,4)+'-'+ltrim(str(@month))+'-'+ltrim(str(@day))+''') GROUP BY 回款数据.客户名称) as 回款2010Y8数据 
    ON 分析目标.客户名称=回款2010Y8数据.客户名称/*--7月回款计算(2009)*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+@str(@year-1,4)+'-'+ltrim(str(@month-1))+'-1'') AND (回款数据.订货日期 <= '''+
     convert(nvarchar(10),dateadd(dd,-1,convert(datetime,str(@year-1,4)+'-'+ltrim(str(@month))+'-1',120)),120)+''') GROUP BY 回款数据.客户名称) as 回款2009Y7数据 
    ON 分析目标.客户名称=回款2009Y7数据.客户名称/*--7月回款计算(2010)*/
    LEFT OUTER JOIN
    (SELECT 回款数据.客户名称, SUM(回款数据.金额) AS 金额 FROM 回款数据 
    WHERE (回款数据.订货日期 > '''+@str(@year-1,4)+'-'+ltrim(str(@month-1))+'-1'') AND (回款数据.订货日期 <= '''+
    convert(nvarchar(10),dateadd(dd,-1,convert(datetime,str(@year-1,4)+'-'+ltrim(str(@month))+'-1',120)),120)+''') GROUP BY 回款数据.客户名称) as 回款2010Y7数据 
    ON 分析目标.客户名称=回款2010Y7数据.客户名称'
    exec(@sql)   --如果执行不成功,屏蔽此语句,print @sql 查看动态生成语句是否正确