我有两张桌子。 (MS SQL Server 2012)
性能
PortfolioID PortfolioCode Date MarketValue
1 Port1 12/31/12 100000
2 Port2 12/31/12 200000
3 Port3 12/31/12 300000
BillingRates
RateID FromRate ToRate Rate
1 1 100000 1
2 100000.01 200000 0.99
3 2000000.01 300000 0.98
4 300000.01 400000 0.97
我想运行一个类似于CASE语句的查询,其中我说如果特定日期投资组合的MarketValue在费率表的各层之间的各个值范围之间,而不是其市场价值乘以其各自的利率。 (费率列表示百分比率)
例如
Port1 falls in the RateID 1 tier and is multiplied by 1 100,000 * 1% = 1000
Port2 falls in the RateID 2 tier and is multiplied by .99 200,000 * .99% = 1980
Port3 falls in the RateID 3 tier and is multiplied by .98 300,000 * .98% = 2940
我有大约100个这样的“案例”并且正在考虑做这样的事情
SELECT COALESCE(
CASE WHEN condition1 THEN calculation1 ELSE NULL END,
CASE WHEN condition2 THEN calculation2 ELSE NULL END,
etc...
)
但我无法弄清楚逻辑或如何最好地加入两个表来实现这一目标。
答案 0 :(得分:1)
你想加入他们:
select p.*, p.MarketValue * br.rate
from Performance p left outer join
BillingRates br
on p.MarketValue between br.[from] and br.[to]
这称为非等值连接。这种连接的性能通常比等连接更差。索引[from], [to]
会有所帮助。
此外,您不应将SQL保留字用作列名。也就是说,“从”和“到”都是不方便的名字。
如果可能没有匹配,那么您可能需要:
select p.*, p.MarketValue * coalesce(br.rate, 1.0)
所以结果不是NULL
。
答案 1 :(得分:1)
您将如何创建程序:
CREATE PROCEDURE Test @MarketValue int
AS
BEGIN
DECLARE @rate decimal;
SET @rate = (SELECT rate
FROM billingrates
WHERE @marketvalue > "from" AND @marketvalue < to)
--Add your calculation and return/output value here
--@rate * @marketvlaue
END