Можно ли более кратко написать запросы на объединение, например, следующие?
select
id,
1,
(1 + @defCapUp) * (p.Value + p.Premium),
getdate()
from Products p
union
select
id,
1,
(1 - @defCapDown) * (p.Value - p.Premium),
getdate()
from Products p
union
select
id,
case when p.Paydate > getdate() then 1 else 0 end,
(1 - @defCapUp) * (p.Value - p.Premium),
@nextYear
from Products p
union
select
id,
case when p.Paydate > getdate() then 1 else 0 end,
(1 + @defCapDown) * (p.Value + p.Premium),
@nextYear
from Products p
Оператор выбирает четыре строки для каждой строки в таблице "Продукты".Единственное, что меняется, - это формула, используемая для вычисления значений для второго столбца и дерева.Я думаю, что в SQL должен быть способ написать выше без такого ужасного дублирования кода.Если бы только функции были объектами первого класса, а sql допускало лямбда-выражения ...
Нижеприведенное решение Ричарда прекрасно, очень хорошо работает в представленном примере.Но в оригинальном примере у меня было две опечатки, которые несколько усложняют задачу:
select
id,
1,
(1 + @defCapUp) * (p.Value + p.Premium),
getdate()
from Products p
union
select
id,
1,
(1 - @defCapDown) * (p.Value - p.Payout),
getdate()
from Products p
union
select
id,
case when p.Paydate > getdate() then 1 else 0 end,
(1 - @defCapUp) * (p.Value - p.Premium),
@nextYear
from Products p
union
select
id,
case when p.Paydate <= getdate() then 1 else 0 end,
(1 + @defCapDown) * (p.Value + p.Payout),
@nextYear
from Products p
Большая проблема заключается в выражении падежа, в котором оператор сравнения отличается.Моя проблема в том, что очень трудно «аккуратно» разобраться с этими случаями.Что если бы был третий случай, когда сравнение было, например, p.Paydate = getdate ()?