sql - 使用列的备用名称时标识符无效
问题描述
我有几行代码,但它不会以某种方式工作。我想将此列称为 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;
解决方案
您想要过滤聚合函数的结果:为此,您需要使用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
推荐阅读
- android - Firebase ML Kit Face Contours:裁剪面部特征
- css - 如何使用 css flex 为桌面制作 4 列,为移动设备制作 2 列?
- security - 提升流程内部流程的各种技巧
- java - Android 9 上的 Chromecast 音量控制器
- python - 使用python查找工作表中单元格的索引值
- jquery - 当其他元素的样式显示时元素不隐藏:表单提交时没有被删除
- python - Spark:区别: sqlContext.read.load(path= '', format= '') 和 sqlContext.read.format().load()
- django - 如何在类基础视图中调用所有函数
- google-apps-script - 复制电子表格/时间触发器不起作用,但手动触发器效果很好
- c# - 我可以查询sqlLocal数据库吗