在 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。
我有一个 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。