【发布时间】:2020-09-27 09:42:30
【问题描述】:
我正在编写一个查询来显示在赛马上进行单程投注的回报
PlaceProfit 结果存在问题 - 如果马匹完成位置在 1-4 之间,则此应该显示返回,如果位置 => 5,则显示失败
如果马匹的完赛名次低于第 9 名,则显示正确的回报,但第 10 名及以上被视为获胜。
我在下面包含我的代码以及输出。
ALTER VIEW EachWayBetting
AS
SELECT a.ID,
RaceDate,
runners,
track.NAME AS Track,
horse.NAME as HorseName,
IndustrySP,
Place AS 'FinishingPosition',
-- // calculates returns on the win & place parts of an each way bet with 1/5 place terms //
IIF(A.Place = '1', 1.0 * (A.IndustrySP-1), '-1') AS WinProfit,
IIF(A.Place <='4', 1.0 * (A.IndustrySP-1)/5, '-1') AS PlaceProfit
FROM dbo.NewRaceResult a
LEFT OUTER JOIN track ON track.ID = A.TrackID
LEFT OUTER JOIN horse ON horse.ID = A.HorseID
WHERE a.Runners > 22
这会返回:
【问题讨论】:
-
看起来像您;将
Place存储为字符串类型数据类型,而不是数字数据类型。'10'的值低于'4',Place的值为'10',则表达式A.Place <= '4'为 true 。修复您的设计,将数值数据存储在数值数据类型中(int在这里似乎很合适)。varchar不是“一刀切”的数据类型;远非如此。 -
另外,当使用文字数值时,不要将它们作为字符串传递,例如
'-1'。他们应该不被引用(只是-1)。 -
@Larnu 谢谢,但是 Place 列也可能存储诸如“PU”之类的数据,以表明这匹马没有完成比赛,因为它是“拉起来”的 - 你知道解决办法吗我遇到的问题?
-
那么,我建议您有 2 列,一列用于数字位置(可以是
NULL),另一列表示马分类失败,例如Pulled Up, Fell, etc. 就目前而言,这是一场 20 匹马的比赛,前“3”马将是第 1、10 和 11 名的马,而“最后”马将是第 9 名的马,不是 20 号, -
在您修复可以在计算之前应用
try_cast(place as int)的数据类型之前,这会从 VarChar 更改为 Int 并为非数字字符串(如 'PU')返回 NULL
标签: sql sql-server tsql