Выберите несколько значений из одного базового значения в виде таблицы - PullRequest
1 голос
/ 26 сентября 2019

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

select (1.2 + ca.MaxReturn),
       (1.0 + ca.MaxReturn),
       (1.0 + ca.MaxReturn * 0.50),
       (1.0 + ca.MaxReturn * 0.25),
       (1.0),
       (ca.BufferLevel + (1.0-ca.BufferLevel)/2.0),
       (ca.BufferLevel + 0.0),
       (ca.BufferLevel - 0.1),
       (ca.BufferLevel - 0.2),
       (ca.BufferLevel - 0.3),
       (0.0)
from  Product.Bren
cross apply (select LowStrike-ProtectionPercentage as BufferLevel,
             ParticipationUpside*UpsideCap MaxReturn) ca
where Id = 1

. Это возвращает набор точек

(No column name)    (No column name)    (No column name)    (No column name)    (No column name)    (No column name)    (No column name)    (No column name)    (No column name)    (No column name)    (No column name)
1.350000000000  1.150000000000  1.07500000000000    1.03750000000000    1.0 0.930000000 0.860000    0.760000    0.660000    0.560000    0.0

, которые я хочу использоватьдля поиска соответствующих значений в другой таблице

Для этого, однако, мне нужно преобразовать этот набор столбцов в один столбец

т.е.

Range
1.3500
1.1500
1.0750
1.0375  
1.0000
0.9300
0.8600
0.7600
0.6600
0.5600
0.0000

Это выглядит так, как мне нужноповернуть результат, но я не вижу, как это сделать.Есть множество (конвертировать столбцы в строки ответов, но ни один из них не отвечает тому, что я хочу.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Вы можете повторить cross apply:

select v.range
from Product.Bren b cross apply
     (values (b.LowStrike - b.ProtectionPercentage, b.ParticipationUpside * b.UpsideCap
             )
     ) ca(BufferLevel, MaxReturn) cross apply
     (values (1.2 + ca.MaxReturn),
             (1.0 + ca.MaxReturn),
             (1.0 + ca.MaxReturn * 0.50),
             (1.0 + ca.MaxReturn * 0.25),
             (1.0),
             (ca.BufferLevel + (1.0-ca.BufferLevel)/2.0),
             (ca.BufferLevel + 0.0),
             (ca.BufferLevel - 0.1),
             (ca.BufferLevel - 0.2),
             (ca.BufferLevel - 0.3),
             (0.0)
      ) v(range)
where b.Id = 1;
0 голосов
/ 26 сентября 2019

UNPIVOT выглядит так, как будто это сделает это

SELECT Descriptor, Range
FROM 
(

    select (1.2 + ca.MaxReturn) a,
           (1.0 + ca.MaxReturn) b,
           (1.0 + ca.MaxReturn * 0.50) c,
           (1.0 + ca.MaxReturn * 0.25) d,
           (1.0) e,
           (ca.BufferLevel + (1.0-ca.BufferLevel)/2.0) f,
           (ca.BufferLevel + 0.0) g,
           (ca.BufferLevel - 0.1) h,
           (ca.BufferLevel - 0.2) i,
           (ca.BufferLevel - 0.3) j,
           (0.0) k
    from  Product.Bren
    cross apply (select LowStrike-ProtectionPercentage as BufferLevel,
                 ParticipationUpside*UpsideCap MaxReturn) ca
    where Id = 1

) x
UNPIVOT
(
    Range
    FOR Descriptor in (a,b,c,d,e,f,g,h,i,j,k)
) AS up

Вы получите два столбца из этого;один с ак (псевдонимы, которые я добавил к вашим неназванным значениям), а другой со значением под заголовком «Диапазон» - на тот случай, если вам все еще нужно отследить, какое значение было чем.

...