首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文公司平均加薪

甲骨文公司平均加薪
EN

Stack Overflow用户
提问于 2020-04-27 14:12:02
回答 2查看 92关注 0票数 0

指示是

对于某一特定公司,如果薪资低于公司平均水平,则加薪30%;如果薪资高于平均水平,则提高10%。

桌子上也有空位的人。

所以我试着

代码语言:javascript
复制
with avgs(company_name, salary) as
    (select company_name, avg(salary) avgsalary
    from work
    group by company_name)
select 
work.employee_name, work.salary,
case when work.company_name = avgs.company_name and work.salary > avgs.salary then work.salary * 1.3
     when work.company_name = avgs.company_name and work.salary < avgs.salary then work.salary * 1.1
     when work.company_name is null and work.salary is null then 0
     when avgs.company_name is null and avgs.salary is null then 0
     end as sal_up
from work, avgs

我想要的结果是每人一个结果。当我运行这个时,我会得到太多的结果。

哪种情况不对?有什么我没想过的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-27 14:16:44

使用窗口函数:

代码语言:javascript
复制
select t.*,
       (case when salary < avg_salary then salary * 1.3 else salary * 1.1 end) as new_salary
from (select w.*, avg(salary) over (partition by company_name) as avg_salary
      from work w
     ) w;

这假设您需要一个select,因为这是您问题中的示例查询。

票数 2
EN

Stack Overflow用户

发布于 2020-04-27 14:21:10

您可以使用windows函数和CASE..WHEN,如下所示:

代码语言:javascript
复制
UPDATE YOUR_TABLE TOUT
SET
    SALARY = (
        SELECT T.NEW_SAL
         FROM ( SELECT T.WORKER_NAME,
                       SALARY * CASE
                                WHEN T.SALARY > AVG(SALARY) OVER(PARTITION BY COMPANY_NAME) 
                                THEN 1.1
                                ELSE 1.3
                                END AS NEWSAL
                  FROM YOUR_TABLE T
              ) T
        WHERE TOUT.WORKER_NAME = T.WORKER_NAME)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61460848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档