我希望在Oracle中提供一个能够显示每个部门平均工资的视图。我使用的表格是员工,其中包含 empno ,薪水和 deptname 字段。
我试图通过这样做来实现:
WHERE
给了我错误:
不是单一的群组功能
然后我尝试通过
对它们进行分组create view v_employee
as select avg(salary),deptname as average_salary from employee
order by name;
给了我错误:
不是GROUP BY表达式
我可以做些什么来制作这种观点?感谢
答案 0 :(得分:4)
select avg(salary),deptname as average_salary
您已请求2列,第一列没有标签,您已将重新标记的deptname设为“average_salary”。所以你可能真的想要:
select deptname, avg(salary) as average_salary
为了产生平均值,必须进行一些算术运算,其中考虑了每个部门的所有工资,即我们将数据“分组”为每个部门的一行。
select deptname, avg(salary) as average_salary from employee
group by deptname
对于select子句中的每一列,我们都没有使用像AVG()
这样的聚合函数,我们必须在group by子句中使用相同的列。如果不这样做,您将收到有关“不是按表达式分组”的错误消息。
我们可以添加创建视图代码:
create view v_employee as
select deptname, avg(salary) as average_salary from employee
group by deptname
但是,您不应该将order by
放入视图中,因为这可能非常低效。当您使用视图是后续查询时,那么包括order by
例如
select *
from v_employee
where deptname like 's%'
order by average_salary DESC
在该示例中,视图中的任何嵌入式顺序都将被丢弃,因为我们现在想要的是最高的平均值。另外,因为我们使用了where子句,所以我们只需要订购几行,而不是所有行。