Sql 从单个基础值中选择多个值作为表

Sql 从单个基础值中选择多个值作为表,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,我有一个表,根据表中的两个基础值从中选择多个值 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),

我有一个表,根据表中的两个基础值从中选择多个值

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
我想用它在另一个表中查找相应的值

但是,要做到这一点,我需要将这组列转换为一个列

i、 e


这看起来我需要改变结果,但我看不出如何改变。有大量的(将列转换为行)答案,但似乎没有一个答案符合我的要求。

您可以重复交叉应用

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(我添加到未命名值中的别名),另一列带有值,标题为“范围”-以防您仍然需要跟踪哪个值是什么值。

您可能需要非常聪明地取消Pivot。谢谢您,我使用了双交叉应用,因为在我看来,它看起来更干净一些
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