sql-server - 击球平均数公式的 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 列?
我究竟做错了什么?
解决方案
错误的原因是您没有像在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
推荐阅读
- amazon-web-services - 使用 spark 处理超大容量(500TB)数据
- asp.net-core - .NET Core 2 基准测试,req/s 远低于预期
- tfs - EF Core 和 Visual Studio 2017:添加迁移不将新文件包含到 TFS 源代码控制中
- coldfusion - 变量 CFUSION_ENCRYPT 未定义
- php - PHP exec python 并获取包含汉字的返回数组
- php - 如何在没有文件扩展名的情况下显示 img
- c# - How to create CombinedGeometry for ellipse and line
- sql-server - IIS 8.5 自定义字段破坏了 LogParser 2.2
- azure - 检查 Azure 自动化运行手册 (PowerShell) 运行位置的方法是什么?
- css - 为焦点创建一个与浏览器无关的或 IE 备用内部按钮边框?(可访问性相关)