首页 > 解决方案 > 击球平均数公式的 TSQL

问题描述

我有一个问题指出:

使用 BETWEEN 子句,查找所有击球率在 0.0.300 和 0.3249 之间的球员。查询应返回全名 (NameGiven (NameFirst) NameLast)、YearID、Hits、At Bats 和 Batting Average,按击球平均值降序排列。

SELECT 
    people.playerid, 
    (nameFirst +' ( '+ nameGiven + ' ) ' + nameLast) AS 'Full Name', 
    yearID, H, AB, 
    CONVERT(decimal(5, 4), h * 1.0 / AB) AS [Batting Average] 
FROM 
    People, Batting
WHERE 
    Batting Average BETWEEN .300 AND 0.3249
ORDER BY
    Batting Average DESC

WHERE我在Batting Average的子句中有一条红色下划线。

为什么它无法识别 Select 中的 Batting Average 列?

我究竟做错了什么?

标签: sql-servertsql

解决方案


错误的原因是您没有像在SELECT子句中那样在字段名称周围使用方括号:[Batting Average].

但是,您不能从SELECT子句中的WHERE子句引用别名。原因是在WHERE评估子句中的表达式之前SELECT评估子句。另一方面,您可以ORDER BY在子句中引用这样的别名。但不要忘记那些括号。

在该WHERE子句中,您必须再次在原始字段上使用公式。

您还应该避免除以零。所以最好检查一下AB不为零。

最后,您没有为这两个表指定连接,因此您的查询将产生笛卡尔积。我假设 Batting 表有一个名为playerid.

因此,考虑到所有这些要点,这应该是一个更好的查询:

SELECT     people.playerid, 
           (nameFirst +' ( '+ nameGiven + ' ) ' + nameLast) AS 'Full Name', 
           yearID, 
           H,
           AB, 
           Convert(decimal(5,4), h*1.0/AB) as [Batting Average] 
FROM       People
INNER JOIN Batting ON Batting.playerid = People.playerid
WHERE      AB <> 0
       AND h*1.0/AB BETWEEN .300 AND 0.3249
ORDER BY   [Batting Average] DESC

推荐阅读