sql - 在列上执行数学的更优雅的方式

标签 sql sql-server tsql sql-server-2012

有没有更优雅的方法:

SELECT TOP (@NumOfGames) 
        (SUM(IIF(Fixture.HomeTeamID = @Team
            ,IIF(Fixture.Goals.FullTimeHomeGoals > Fixture.Goals.FullTimeAwayGoals
                    ,1 
                    ,IIF(Fixture.Goals.FullTimeHomeGoals < Fixture.Goals.FullTimeAwayGoals, 0, 0.5) 
                ) --IsHomeTeam
            ,IIF(Fixture.Goals.FullTimeAwayGoals > Fixture.Goals.FullTimeHomeGoals
                    ,1 
                    ,IIF(Fixture.Goals.FullTimeAwayGoals < Fixture.Goals.FullTimeHomeGoals, 0, 0.5) 
                ) --IsAwayTeam
        )) / @NumOfGames) * 100 AS Result
    FROM 
        Fixture.Fixture 
    INNER JOIN 
        Fixture.Goals ON Fixture.Goals.FixtureID  = Fixture.Fixture.FixtureID
    WHERE 
        HomeTeamID = @Team 
        OR 
        AwayTeamID = @Team 

我非常讨厌 SUM 部分,一定有更好的方法来做到这一点。

用户将@NumOfGames 和@Team 作为参数输入到存储过程。然后它会检查目标表以查看球队是否赢、平或输。赢是1分,平是0.5,输是0。我想输出这些数字的总和,除以NumOfGames再乘以100得到成功率。

最佳答案

哎呀。 Microsoft 似乎已将 IIF 添加到 SQL Server 2012 中。无论如何,您可能会发现标准 SQL 方式更具吸引力。这将使用 CASE 语句:

SELECT TOP (@NumOfGames) 
       (SUM(case when Fixture.HomeTeamID = @Team and
                      Fixture.Goals.FullTimeHomeGoals > Fixture.Goals.FullTimeAwayGoals
                 then 1.0
                 when Fixture.HomeTeamID = @Team and
                      Fixture.Goals.FullTimeHomeGoals = Fixture.Goals.FullTimeAwayGoals
                 then 0.5
                 when Fixture.HomeTeamID = @Team
                 then 0.0
                 when Fixture.HomeTeamID <> @Team and
                      Fixture.Goals.FullTimeAwayGoals > Fixture.Goals.FullTimeHomeGoals
                 then 1.0
                 when Fixture.HomeTeamID <> @Team and
                      Fixture.Goals.FullTimeAwayGoals = Fixture.Goals.FullTimeHomeGoals
                 then 0.5
                 else 0.0
        end) / @NumOfGames) * 100 AS Result
FROM 
    Fixture.Fixture 
INNER JOIN 
    Fixture.Goals ON Fixture.Goals.FixtureID  = Fixture.Fixture.FixtureID
WHERE 
    HomeTeamID = @Team 
    OR 
    AwayTeamID = @Team 

作为记录,比较“Fixture.HomeTeamID <> @Team”在 case 语句中是不必要的,只是为了使其更具可读性(并且效率降低一点)。 case 语句的工作原理是按顺序评估 WHEN 子句,然后选择第一个匹配的子句。

我们可以请求微软删除 IIF() 吗? ;-)

关于sql - 在列上执行数学的更优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962628/

相关文章:

sql - 从一个表中检索记录,只要它们不存在于另一个表中 T-SQL

sql - 如果表有一行或多行存在一个条件,则获取 ID

sql-server - 如何知道SQL存储过程更新已执行

php - 子查询和主查询中的日期之前

c# - 如何使用 C# 将字符串存储在 varbinary(max) 列中

mysql - SQL 查询统计那些在另一天购买了 3 种以上产品的人在一天内购买了多少产品

sql - 删除 SQL Server 字段末尾的隐藏字符

sql - 选择 SQL 查询以从 ntext 列获取 xml 节点值?

sql - 查询多列不同条件的数据

python - 在左连接中使用类似 SQL 的连接和过滤器(之间)合并表