在 SQL 聚合函数中用任意数字替换字母

Replace letters with arbitrary numbers in SQL aggregate function

我有一个 table 看起来像这样:

+----+-----------+-------+
| id |  subject  | grade |
+----+-----------+-------+
|  1 | english   | 2     |
|  1 | math      | 3     |
|  1 | physics   | 1     |
|  1 | chemistry | 1     |
|  1 | biology   | *     |
|  2 | english   | 1     |
+----+-----------+-------+

我想运行一个

AVG(grade) OVER (PARTITION BY id ORDER BY id DESC) AS 'Average Grade'

但是当然不行,因为有 *、A、B 等等级。

有没有办法告诉 AVG 在其计算中用任意值替换字母,例如

*。 * = 0

*。 A = 1

*。 B = 2

AND 忽略 N/A 或 X 等字段。

提前致谢

编辑:

我的 DBMS 是 Sql 服务器

您可以尝试在AVG函数中使用CASE WHEN

AVG(CASE WHEN grade = '*' THEN 0 
     WHEN grade = 'A' THEN 1 
     WHEN grade = 'B' THEN 2 
     ....
    ELSE grade END) OVER (PARTITION BY id ORDER BY id DESC) AS 'Average Grade'

注意

我建议你让 grade 是 int 数据类型而不是字符串,因为这样更容易计算。

您可以使用巨大的 case 表达式作为 avg() 的一部分。但是,我建议您有一个参考 table 或至少一个派生的 table 来处理映射:

第二个(partition by id order by id)没有意义。您想要 id(我的猜测)的完整平均值,或者您想要 运行 的平均值。所以,

select avg(v.grade_val) over (partition by t.id) as id_average_grade
from t outer apply
     (select 
      from (values ('A', 1), ('B', 2), ('*', 0), ('1', 1), ('2', 2), . . .
           ) v(grade, grade_val)
      where v.grade = t.grade
     ) v(grade_val)

请注意,内部 values() 可能是 真实的 引用 table。