Oracle SQL Developer创建视图分配

时间:2016-04-19 23:36:26

标签: sql oracle sql-view

我的作业有以下说明:

创建一个名为A11T1的视图(即A-One-One-T-One,而不是ALLTL),它将显示Cat值为N且薪水至少为30的人的连接名称,JobTitle和Salary比Cat值为N的所有人的平均工资高出百分之三。三列标题应该是姓名,工作标题和薪水。行应按传统电话簿顺序排序。

注1:与往常一样,连接名称必须在名字和姓氏之间显示一个空格。

注意2:必须以适当的方式显示连接的名称和职称(例如,Mary Ellen Smith,助理经理)。

注3:记住,Person11数据很乱。当您识别Cat值为N的人时,请务必查找N和n。

到目前为止我所拥有的是:

CREATE VIEW A11T1 AS 
SELECT INITCAP(FNAME||' '||LNAME) AS "Name", INITCAP(JobTitle), Salary
FROM PERSON11
WHERE UPPER(CAT) = 'N'
GROUP by INITCAP(FNAME||' '||LNAME), INITCAP(JobTitle), Salary
HAVING SALARY >= 1.3 * ROUND(AVG(SALARY),0)
Order by LNAME, FNAME 
  

命令行错误:7列:10错误报告:SQL错误:ORA-00979:不是GROUP BY表达式00979. 00000 - “不是GROUP BY表达式”

我正在获得当前错误

无论我编辑多少代码,它都不会创建成一个视图,我已经被困在这几个小时了!我感谢任何回应,甚至是正确方向的一点。

2 个答案:

答案 0 :(得分:0)

我认为最简单的方法是使用窗口函数:

CREATE VIEW A11T1 AS 
    SELECT INITCAP(FNAME || '  '|| LNAME) AS Name, INITCAP(JobTitle), Salary
    FROM (SELECT p.*, AVG(SALARY) OVER () as avg_salary
          FROM FROM PERSON11 p
          WHERE UPPER(CAT) = 'N'
         ) p
    WHERE SALARY >= 1.3 * avg_salary
    ORDER BY LNAME, FNAME ;

答案 1 :(得分:0)

为什么你需要“分组”连接名称,职称和薪水?每个名字有多行吗?

也许是因为你需要计算平均工资并且需要汇总?您无法在SQL中的单个SELECT语句中执行所有操作(至少不能使用简单的工具 - 您似乎处于学习的早期阶段,而不是使用窗口函数)。

“平均薪水”需要来自子查询。如果你有>= 1.3 * round(...),你应该改为:

... >= 1.3 * (select avg(salary) from person11 where cat = 'N')

请注意,子查询必须括在括号中。在您的代码中,我看到您使用upper(cat) - 是否担心猫可能是大写还是小写?在这种情况下,写出

可能更好
cat in ('n', 'N')

尽可能避免将列值包含在函数内(这通常会导致性能下降)。另外,我认为没有必要在你的要求中舍入平均工资 - 无论如何,如果再乘以1.3,那么舍入到零小数位的意义是什么?舍入实际上可能导致输出错误。

编辑:对不起,澄清一下:我觉得你已经顺利了。使用子查询获得平均工资,删除组(不会伤害任何东西,但实际上不需要),如果你愿意,可以按照我的建议改变上层(猫);我认为您的查询将适用于这些更改。

祝你好运!