2017-06-13 74 views
-2

我已經整理了一個小型數據庫,以跟蹤一些我和我的同事在足球賽季放置的一些累積投注。現在我需要編寫一個函數來計算每個選擇的獎金。關鍵表是選擇功能的關鍵字段爲賠率和result_id,其中1的result_id是勝利。賭注存儲在賭注表中。以下是有兩個bet_id 1獲勝者的選擇表,所以得到的方程將是((@stake * 1.40)* 1.40)。有沒有使用遊標或基於集合的方法來產生這個值的方法?有條件地遍歷列中的每個值

bet_id punter_id team_id odds result_id ground_id 
1  1   24  1.40 1   1 
1  1   48  1.60 2   1 
1  1   89  1.60 2   1 
1  2   8  1.40 1   1 
1  2   11  1.60 2   1 
1  2   107  1.60 2   1 
+0

應該不需要光標就可以做到這一點。什麼將賭注加入選擇表? Bet_id? – Leonidas199x

+3

這是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+1

是的,我根本不明白你的問題。 –

回答

0

假設你加入的bet_id

CREATE TABLE bet (bet_id int NOT NULL PRIMARY KEY, 
        stake float NOT NULL); -- or some floating point number type 

要乘我們用下面的關係組:

log(a * b * c) = log(a) + log(b) + log(c) 

也因此乘法

a * b * c = exp(log(a * b * c)) = exp(sum(log(.))) 

要計算因素

bet_id | odds_factor 
1  | 1.40 * 1.40 = 1.96 

我們使用公用表表達式CTE在此查詢

WITH factor(bet_id, odds_factor) AS 
    (SELECT bet_id, exp(sum(log(odds))) 
    FROM selection 
    WHERE result_id = 1 -- only winning odds in the grouping 
    GROUP BY bet_id) 
SELECT b.bet_id, 
     b.stake, 
     f.odds_factor, 
     b.stake * f.odds_factor AS "total_odds" 
FROM bet b 
INNER JOIN factor f 
ON b.bet_id = f.bet_id 
-- ORDER BY b.bet_id -- optional ordering for readability 

應該得到(未經測試)

bet_id | stake | odds_factor | total_odds 
1  | 10.0 | 1.96  | 19.6 
0

認爲這很簡單,只要:

SELECT  B.BET_ID, 
      S.PUNTER_ID, 
      ((B.stake * S.odds) * S.odds) 
FROM  BET   AS B 
INNER JOIN SELECTION AS S ON B.Bet_id = S.Bet_id 
WHERE  S.result_id = 1