【问题标题】:More elegant way of performing math on columns在列上执行数学的更优雅的方式
【发布时间】:2012-08-11 08:30:11
【问题描述】:

有没有更优雅的方法:

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 得到成功率。

【问题讨论】:

  • 为什么这个标签是 sql-server-2008?这对我来说就像 MS Access 语法。 “IIF”不是 SQL Server 函数。

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


【解决方案1】:

哎呀。 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() 吗? ;-)

【讨论】:

  • +1 尤其是您的最后一句话。唯一具有较少实用程序的 SQL Server 2012 功能是 EOMONTH()。恕我直言。
  • 他们到底为什么要添加 IFF?
  • @HLGEM 。 . .显然,他们添加了 IFF 以使将 Access 代码移植到 SQL Server 更容易。但是,我只是不认为 Access 是 SQL 的全部和最终模型。我宁愿他们专注于符合 ANSI。但 。 . . 2012 年有一些很棒的新功能——比如累计金额——弥补了其他一切;)
  • 实际上,如果 HomeTeamID 为 NULL,删除“Fixture.HomeTeamID @Team”会改变功能。
猜你喜欢
  • 2013-06-29
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多