Расширенная система скидок в хранимой процедуре

Я делаю хранимую процедуру для ежемесячных продаж. В хранимой процедуре у нас есть Discount. Эту скидку можно получить из трех разных таблиц. Если скидки нет в id.rabatt, она должна быть получена с dp.rabatt, если ее нет, она должна быть получена с ds.rabatt. Так что первые два могут быть пустыми, а последний всегда со скидкой.

У меня большие проблемы с разработкой части КОГДА процедуры. Пожалуйста, посмотрите и помогите мне в пути, если у вас есть время:

                     CASE (
                 when 
                Isnull(id.rabatt, Isnull(u.rabatt, id.rabatt)) then.. 
                when 
                 Isnull(dp.rabatt, Isnull(x.rabatt, dp.rabatt)) then..
                 when 
                 Isnull(ds.rabatt, Isnull(y.rabatt, ds.rabatt)) then..
                 end)
                 AS 'Discount', 

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

           LEFT OUTER JOIN discount AS id 
                    ON id.identifiers = isa.identifiers 
                       AND id.store = BV.name 
                       AND id.from_date <= isa.sales_date 
                       AND id.to_date >= isa.sales_date 
                       AND id.to_date < '2999-01-01' 
       LEFT OUTER JOIN discount AS u 
                    ON u.identifiers = isa.identifiers 
                       AND u.to_date = '2999-01-01' 

Две другие таблицы устроены аналогичным образом.


person Lebowski    schedule 25.06.2014    source источник


Ответы (1)


Вы можете использовать функцию объединения так же, как вы используете функцию IsNull. Есть некоторые тонкие различия между IsNull и Coalesce, но существенное отличие, которое принесет пользу вашему коду, заключается в том, что вы можете иметь несколько параметров без необходимости их вложения.

Ваш код: Isnull(id.рабатт, Isnull(u.рабатт, id.рабатт))

То же, что: Coalesce(id.rabatt, u.rabatt, id.rabatt)

Далее... есть 2 общие формы для случая/когда.

Case (Some Condition)
     When (Value 1) Then ...
     When (Value 2) Then ...
     Else (Default Value)
     End

Or

Case When (SomeCondition = Value1) Then ...
     When (SomeCondition = Value2) Then ...
     Else DefaultValue
     End

Глядя на ваш фрагмент кода, кажется, что вы используете вторую форму, но у вас нет оператора сравнения в части, когда. Я думаю, вы хотите что-то вроде этого...

CASE When Coalesce(id.rabatt, u.rabatt, id.rabatt) Is Not NULL then.. 
     When Coalesce(dp.rabatt, x.rabatt, id.rabatt) Is Not NULL then..
     When Coalesce(ds.rabatt, y.rabatt, id.rabatt) Is Not NULL then..
     Else (Put a default value here)
     end AS [Discount]
person George Mastros    schedule 25.06.2014
comment
Я думаю, что вам может не понадобиться CASE/WHEN и, вероятно, вы могли бы обойтись только функцией Coalesce. Замените CASE/WHEN на: Coalesce(id.rabatt, dp.rabatt, ds.rabatt) As [Скидка] - person George Mastros; 25.06.2014
comment
Спасибо, завтра утром проверю и свяжусь с вами :) - person Lebowski; 25.06.2014
comment
Сработало идеально, просто нужно было внести небольшие изменения и добавить Coalesce.. Большое спасибо :) - person Lebowski; 26.06.2014