【问题标题】:Group by, avg difficulties in SQLPlus分组方式,SQLPlus 中的平均难度
【发布时间】:2015-02-18 06:51:48
【问题描述】:

我正在尝试获取一个 sqlplus 表,以便为我提供每家公司的工人,他们的收入高于该公司的平均工资。

(例如,第一国民银行的平均工资为 50,000 美元。James 和 Jane 在那里工作,收入为 80,000 美元,Billy 的收入为 40,000 美元。Fredco 的平均工资为 30,000 美元。员工 Mark 的收入为 35,000 美元,Timmy 的工资为 25,000 美元。James、Jane 和 Mark 的结果给出了名称。)

但是,我在试图让它正确运行时遇到了所有错误。任何帮助或提示将不胜感激。

这是创建表格的代码。 (忽略外键引用:链接到没有此查询所需的任何数据的其他表。)

create table works
(employee_name  varchar(20) PRIMARY KEY,
company_name    varchar(30) NOT NULL,
salary          numeric(9, 2) NOT NULL,
foreign key (employee_name) references employee,
foreign key (company_name) references company);

这就是我所拥有的。截至目前,错误 ORA-01427 是响应。 (单行子查询返回多行。)

select employee_name
from works
where salary > (select avg(salary)
                from works
                group by company_name);

提前感谢您的任何提示或帮助。

【问题讨论】:

标签: oracle sqlplus


【解决方案1】:

使用以下查询:

select w.employee_name from works w 
join (select company_name,avg(salary) salary
from works
group by company_name) q on w.company_name=q.company_name and w.salary > q.salary;

SQLFIDDLE DEMO

【讨论】:

  • 而且我因为没有早点看到这一点而感到非常愚蠢。非常感谢你的帮助。似乎现在可以工作了。
  • 不客气,请参阅this demo,如果这对您有帮助,您可以接受答案。
  • 如果表中有超过 1 家公司的数据怎么办?
  • 那么他需要使用group by,我来为它添加查询
  • @Machinist'sGuardianArchangel 答案已编辑,您可以检查一下
【解决方案2】:

比如:

select employee_name
from (select employee_name, salary, avg(salary) over (partition by company_name) avg_co_salary
      from works)
where salary > avg_co_salary;

这可能比两次遍历工作表更快,但话又说回来,也许不是 - 这完全取决于您的数据、索引等。您必须进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 2016-11-29
    相关资源
    最近更新 更多