2013-06-24 75 views
0

我有兩張桌子。 (MS SQL Server 2012中)根據值範圍乘以字段的值CASE?合併?

性能

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語句的查詢,我說,如果的市場價值在特定日期組合是關於費率表比其市場價值是通過其各自的速率乘以所述層內的variousvalue範圍之間。 (率列表示百分比率)

例如

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

什麼數據庫系統,您使用的?如果你有很多的這些條件那麼它很可能是最好創建一個程序來做到這一點(如果計算類似,但不同的值) –

+0

MS SQL Server 2012的 –

+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

+0

市值基於率梯隊它落在正確率成倍增加。我可以改變,併成爲frromrateand torate –

+0

改名字fraomrate和torate –

+0

這可能是工作。需要測試一下。 –

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 
[email protected] * @marketvlaue 

END 
+0

謝謝你的嘗試,但似乎在這裏失蹤。我需要從性能表中提取信息,例如portfoliocode,日期和市場值,以便與billingrates表上的費率進行交叉引用。我在這裏看不到發生這種情況。 –

+0

你可以很容易地修改該採取投資組合中的ID和日期(或你想要什麼都)使用ID選擇你需要做你的計算和輸出你所需要的所有信息,然後。就拿如何創建存儲過程來看看[本教程(http://www.mssqltips.com/sqlservertutorial/160/sql-server-stored-procedure/)。我可以爲你更新,但我不完全瞭解你的輸出和你提供的輸入。 –

+0

這是我最終使用的查詢。請注意,Performance和BillingRates在兩個不同的表上。 –