我的作业有以下说明:
创建一个名为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表达式”
我正在获得当前错误
无论我编辑多少代码,它都不会创建成一个视图,我已经被困在这几个小时了!我感谢任何回应,甚至是正确方向的一点。
答案 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,那么舍入到零小数位的意义是什么?舍入实际上可能导致输出错误。
编辑:对不起,澄清一下:我觉得你已经顺利了。使用子查询获得平均工资,删除组(不会伤害任何东西,但实际上不需要),如果你愿意,可以按照我的建议改变上层(猫);我认为您的查询将适用于这些更改。 祝你好运!