求两个 CASE 语句的总和 - (How to use a CASE expression or Lateral JOIN

Find the sum total of two CASE statements - (How to use a CASE expression or Lateral JOIN

我要查找单向赛马投注的总利润

我已经创建了一个视图来显示投注的每个部分的赔率和 returns,但我想添加另一列 (EachWayProfit) 以查找总利润。虽然收到语法错误,但我试图简单地对两个 case 语句求和。

我在下面包含我的代码和输出,

ALTER VIEW EachWayBetting
AS

SELECT rc.ID, rc.RaceDate, rc.Runners,
       t.NAME AS Track, h.NAME as HorseName, 
       rc.place as FinishingPosition, 
       rc.IndustrySP as WinOdds,
       (rc.IndustrySP-1) / 5 as PlaceOdds,


 -- // calculates profit individually on the win & place parts of an each way bet with 1/5 place terms //
  
(CASE WHEN TRY_CONVERT(int, rc.Place) = 1 THEN (rc.IndustrySP - 1.0) ELSE -1 END) AS WinProfit,
(CASE WHEN TRY_CONVERT(int, rc.Place) <= 6 THEN (rc.IndustrySP - 1.0) / 5 ELSE -1 END) AS PlaceProfit

FROM dbo.NewRaceResult rc LEFT JOIN
   track t
   ON t.ID = rc.TrackID LEFT JOIN
   horse h
   ON h.ID = rc.HorseID
WHERE rc.Runners > 20 

这个Returns:

我想将投注的赢奖和投注部分的总 returns 添加到新列 - EachWayProfit

我该如何组织这个问题?

-- // calculates total profit on the win & place parts the each way bet //
  
  CASE SUM(
  (CASE WHEN TRY_CONVERT(int, rc.Place) = 1 THEN (rc.IndustrySP - 1.0) ELSE -1 END)  
  +  
  (CASE WHEN TRY_CONVERT(int, rc.Place) <= 6 THEN (rc.IndustrySP - 1.0) / 5 ELSE -1 END)
  ) AS EachWayProfit

如果您想计算同一行中两个值的总和,那么您通常需要重复条件表达式,例如:

CASE WHEN TRY_CONVERT(int, rc.Place) = 1 THEN (rc.IndustrySP - 1.0) ELSE -1 END
+ CASE WHEN TRY_CONVERT(int, rc.Place) <= 6 THEN (rc.IndustrySP - 1.0) / 5 ELSE -1 END as EachWWayProfit

在 SQL 服务器中,横向连接很方便避免冗余:

ALTER VIEW EachWayBetting AS
SELECT 
    rc.ID, 
    rc.RaceDate, 
    rc.Runners, 
    t.name AS Track, 
    h.name as HorseName, 
    rc.place as FinishingPosition, 
    rc.IndustrySP as WinOdds, 
    (rc.IndustrySP-1) / 5 as PlaceOdds,
    pr.WinProfit,
    pr.PlaceProfitn
    pr.WinProfit - pr.PlaceProfit EachWWayProfit
FROM dbo.NewRaceResult rc 
LEFT JOIN track t ON t.ID = rc.TrackID 
LEFT JOIN horse h ON h.ID = rc.HorseID
CROSS APPLY (VALUES (
    CASE WHEN TRY_CONVERT(int, rc.Place) = 1 THEN (rc.IndustrySP - 1.0) ELSE -1 END,
    CASE WHEN TRY_CONVERT(int, rc.Place) <= 6 THEN (rc.IndustrySP - 1.0) / 5 ELSE -1 END
) pr(WinProfit, PlaceProfit)
WHERE rc.Runners > 20