首页 > 解决方案 > 使用列的备用名称时标识符无效

问题描述

我有几行代码,但它不会以某种方式工作。我想将此列称为 round() 名称“Diem”以供以后使用,但 Diem >= 1 使其成为无效标识符。有人可以帮忙吗?

select id, name, round(avg(
decode(grade, 'A+', 4.5,'A', 4,
'A-',3.5, 'B+',3, 'B',2.5, 'B-', 2,
'C+', 1.5, 'C', 1, 'C-',0.5
)), 1) as ***DIEM***
from takes t join student s 
using (id)
where tot_cred >= 128
and ***DIEM*** >= 1
group by id, name;

标签: sqloraclejoinselectaverage

解决方案


您想要过滤聚合函数的结果:为此,您需要使用having子句而不是where子句。

此外,您不能访问在select子句中定义的别名where(也不能在havingOracle 中的子句中)。

您需要重复表达式或使用派生表(子查询或 cte)。

select 
    id, 
    name, 
    round(avg(decode(grade, 'A+', 4.5,'A', 4, ...)), 1) as diem
from takes t 
inner join student s using (id)
where tot_cred >= 128
group by id, name
having round(avg(decode(grade, 'A+', 4.5,'A', 4, ...)), 1) >= 1

在这里,将解码移动到子查询可能更简单。假设grades来自takes表格:

select 
    id, 
    name, 
    round(avg(t.new_grade), 1) as diem
from (
    select t.*, decode(grade, 'A+', 4.5, 'A', 4, ...) as new_grade
    from takes t
) t 
inner join student s using (id)
where tot_cred >= 128
group by id, name
having round(avg(t.new_grade), 1) >= 1

推荐阅读