使用列的备用名称时标识符无效

zwghvu4y  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(317)

我有一些代码行,但不知怎的它不会工作。我想用名称“diem”来调用这个列round(),但是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;
dldeef67

dldeef671#

您希望对聚合函数的结果进行筛选:为此,需要使用 having 从句而不是 where 条款。
此外,您不能访问在中定义的别名 select 合同条款 where 条款(或 having (oracle中的子句)。
您需要重复表达式或使用派生表(子查询或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

相关问题