2015-11-27 2 views
0

У меня есть проблема с моим триггером, это выглядит следующим образом:Как оптимизировать мой триггер с помощью математики?

CREATE TRIGGER [Balance_monthly] 
ON [dbo].[Balance] 
FOR INSERT, UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON 

    UPDATE Months 
    SET Months.Balance_monthly = 
     CASE 
      WHEN Balance.In_Months > 1 THEN Amount_Monthly   
     END 
    FROM Balance 
    JOIN Months 
    ON Months.Id <= Balance.In_Months; 

    UPDATE Months 
    SET Months.Balance_monthly = 
    CASE 
     WHEN Balance.In_Months >= 13 THEN Amount_Monthly * 2   
    END 
    FROM Balance 
    JOIN Months 
    ON Months.Id <= Balance.In_Months - 12; 

    UPDATE Months 
    SET Months.Balance_monthly = 
    CASE 
     WHEN Balance.In_Months >= 25 THEN Amount_Monthly * 3   
    END 
    FROM Balance 
    JOIN Months 
    ON Months.Id <= Balance.In_Months - 24; 

END 

Это таблица, в которой хранится мой триггер, есть только одна строка, и он будет оставаться таким образом, так что не думаю о том, что , My table

Это таблица, в которую я помещал значения в зависимости от количества In_Months. My other table

Как вы можете видеть, это работает отлично до тех пор пока в In_Months получить более 37. Мой вопрос, если есть какие-то умные головы, которые там могли бы помочь мне о том, как сделать это не вычислить его, независимо от того, сколько In_Months есть ,

+0

Какова логика, в которой '> 1' используется в первом сравнении, но'> = 13', '> = 25' и т. Д. В других сравнениях? –

+0

if'> 1' то он просто берет его непосредственно из Amount_Monthly, но если он '= = 13, то он должен' * 2' – Bungicasse

+0

Нет, я имею в виду, почему первое сравнение «Больше» и все другое сравнения «больше или равно»? Что такое код, который нужно сделать, если 'In_Months' точно равен 1? –

ответ

1

Я думаю что это выражение следует вычислить, что вы хотите:

UPDATE Months 
SET Months.Balance_monthly = 
    ((Balance.In_Months + 12 - Months.Id)/12) * Amount_Monthly   
FROM Balance 
CROSS JOIN Months; 

В предположении, что, если In_Months является 1, мы должны быть заходящим значение за январь.

+0

Это именно то, что я хотел, спасибо, гениальный гений! – Bungicasse

+0

Можете ли вы объяснить, что делает «CROSS JOIN» в этой ситуации? Я ничего не могу найти в Google, который объясняет это. – Bungicasse

+0

Я удалил 'CROSS JOIN', потому что это кажется ненужным. – Bungicasse

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