我必须在列中找到包含字母和数字的数字的平均值。由于AVG()仅在列仅包含数字时才有效,因此我必须将字母更改为数字或将其更改为空白单元格。这就是我现在所拥有但不起作用的
declare Grade as integer
cast(replace(replace(replace(grades.grade,'A',''),'B',''),'C','') as int) as cleanGrade
答案 0 :(得分:0)
大多数数据库都有一些确定值是否为数字的方法。例如,在SQL Server中,您可以使用try_convert()
:
select avg(try_convert(decimal(10, 4), grade))
或者在MySQL中,您可以使用:
select (case when grade regexp '^[0-9]*[.]?[0-9]*$' then grade end)
大多数其他数据库都有类似的逻辑。
答案 1 :(得分:0)
如果您希望将字母映射到数字,例如,将字母等级映射到数值,则可以使用CASE ... WHEN ... THEN ... END
表达式。
假设成绩为A
,B
,C
,D
和F
,您可以按以下方式执行:
SELECT AVG(
CASE Grade
WHEN 'A' THEN 100
WHEN 'B' THEN 90
WHEN 'C' THEN 80
WHEN 'D' THEN 60
WHEN 'F' THEN 0
ELSE CAST(Grade AS int)
END
)
FROM Grades