Select 来自单个基础值的多个值作为 table

Select multiple values from a single underlying values as a table

我有一个 table select 基于 table

中两个基础值的多个值
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

这returns一组点数

(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

我想用来在另一个 table

中查找相应的值

为此,我需要将这组列转换为单个列

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

这看起来我需要调整结果,但我不知道如何调整。有很多(将列转换为行的答案,但 none 似乎回答了我想要的。

您可以重复 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;

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

您将从中得到两列;一个带有 a-k(我添加到您的未命名值的别名),另一个带有值,在标题 "Range" 下 - 以防万一您仍然需要跟踪哪个值是什么。