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" 下 - 以防万一您仍然需要跟踪哪个值是什么。
我有一个 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" 下 - 以防万一您仍然需要跟踪哪个值是什么。