根据值范围CASE乘以字段值?合并?

时间:2013-06-24 02:01:12

标签: sql sql-server-2012 case coalesce boolean-expression

我有两张桌子。 (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...
)

但我无法弄清楚逻辑或如何最好地加入两个表来实现这一目标。

2 个答案:

答案 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