2015-05-04 3 views
1

У меня есть повторяющийся SQL-запрос, чтобы заполнить простую таблицу на основе субаккаунтов/лет из списка сумм, удерживаемых субсчетами/годами, но не существует отношения один к одному. Вывод предназначен для отчета SSRS.Упрощение повторяющегося запроса SQL Server

CREATE TABLE [dbo].[Results](
     [SchemeDescription] [varchar](50) NULL, 
     [SubAccountYear] [varchar](15) NULL, 
     [RowNumber] [int] NULL, 
     [2008] [money] NULL, 
     [2009] [money] NULL, 
     [2010] [money] NULL, 
     [2011] [money] NULL, 
     [2012] [money] NULL, 
     [2013] [money] NULL, 
     [2014] [money] NULL, 
     [2015] [money] NULL, 
     [2016] [money] NULL, 
     [2017] [money] NULL, 
     [2018] [money] NULL, 
     [2019] [money] NULL, 
     [2020] [money] NULL, 
     [Processed] [int] NULL 
) ON [PRIMARY] 
UPDATE res 
     SET 
      [2008] = res.[2008] + isnull(x.[2008],0) 
      ,[2009] = res.[2009] + isnull(x.[2009],0) 
      ,[2010] = res.[2010] + isnull(x.[2010],0) 
      ,[2011] = res.[2011] + isnull(x.[2011],0) 
      ,[2012] = res.[2012] + isnull(x.[2012],0) 
      ,[2013] = res.[2013] + isnull(x.[2013],0) 
      ,[2014] = res.[2014] + isnull(x.[2014],0) 
      ,[2015] = res.[2015] + isnull(x.[2015],0) 
      ,[2016] = res.[2016] + isnull(x.[2016],0) 
      ,[2017] = res.[2017] + isnull(x.[2017],0) 
      ,[2018] = res.[2018] + isnull(x.[2018],0) 
      ,[2019] = res.[2019] + isnull(x.[2019],0) 
      ,[2020] = res.[2020] + isnull(x.[2020],0) 
      ,processed = **1** 
     FROM [Results] res 
     INNER JOIN [Other_Income] as x 
      ON x.SubAccountYear = Cast(Cast(res.SubAccount AS Int)as Varchar(10)) + '¬' 
+ Cast (YEAR(res.Inception_Date)+ **1** as varchar(4)) 
       AND x.Processed = 0 
      WHERE res.RowNumber = 1 

Я должен повторить запрос выше в 10 раз, чтобы убедиться, что все субсчета лет распределяются на соответствующий субсчет, фигуры, окруженные звездочками необходимо перечислить от 1 до 10.

Я Конечно, есть другой способ, но он ускользает. Любые идеи оценили.

ответ

1

Предполагая, что я вас правильно понимаю, вы должны обернуть свой оператор обновления хранимой процедурой, которая принимает обрабатываемое значение как переменную. что-то вроде этого:

CREATE PROCEDURE UpdateResults (
    @Processed int 
) 
AS 
UPDATE res 
    SET 
     [2008] = res.[2008] + isnull(x.[2008],0) 
     ,[2009] = res.[2009] + isnull(x.[2009],0) 
     ,[2010] = res.[2010] + isnull(x.[2010],0) 
     ,[2011] = res.[2011] + isnull(x.[2011],0) 
     ,[2012] = res.[2012] + isnull(x.[2012],0) 
     ,[2013] = res.[2013] + isnull(x.[2013],0) 
     ,[2014] = res.[2014] + isnull(x.[2014],0) 
     ,[2015] = res.[2015] + isnull(x.[2015],0) 
     ,[2016] = res.[2016] + isnull(x.[2016],0) 
     ,[2017] = res.[2017] + isnull(x.[2017],0) 
     ,[2018] = res.[2018] + isnull(x.[2018],0) 
     ,[2019] = res.[2019] + isnull(x.[2019],0) 
     ,[2020] = res.[2020] + isnull(x.[2020],0) 
     ,processed = @Processed 
    FROM [Results] res 
    INNER JOIN [Other_Income] as x 
     ON x.SubAccountYear = Cast(Cast(res.SubAccount AS Int)as Varchar(10)) + '¬' 
+ Cast (YEAR(res.Inception_Date)+ @Processed as varchar(4)) 
      AND x.Processed = 0 
     WHERE res.RowNumber = 1 

А затем просто запустить его (возможно, в то время как петля):

Declare @processed int = 1 
While @processed < 11 
begin 
    exec UpdateResults @processed 
    set @processed = @processed + 1 
end 
+0

Спасибо. Я задавался вопросом, могу ли я использовать только SQL, а не SP или цикл. – Anthony

+0

Хранимая процедура * есть * просто sql ... здесь нет магии ... –

Смежные вопросы