找到两个CASE语句的总和-如何使用CASE表达式或横向JOIN

问题描述

我正在寻找单项赛马投注的总利润

我创建了一个视图来显示下注的每个部分的赔率和回报,但是我想添加另一列(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 

这将返回:

enter image description here

我想将下注的获胜和放置部分的总回报添加到新列-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 Server中,横向联接非常方便,可以避免重复:

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