聚合函数中的CASE

时间:2014-10-21 11:57:59

标签: sql oracle

我查了一下,在论坛上找到了一些链接,但没有一个我觉得适用于我的问题,或者似乎与我的结果相同。我需要做的就是......

如果工资超过工资平均值,则列出所有员工姓氏,名字,工资和more_employees表中的“比较列”,此列输出'高薪'否则输出'低薪'

我已经解决了这个......

SELECT first_name, last_name, salary,
       CASE WHEN salary > AVG(salary) THEN 'High-Pay' 
            WHEN salary < AVG(salary) THEN 'Low-Pay'
            ELSE 'Average' AS CompareColumn
       END 
FROM more_employees 

我得到的错误是

&#34;不是单组组功能&#34;

所以我最后添加一个组中的任何一个列名称然后我得到

&#34;不是分组功能&#34;

所以我被困住了,现在已经有一段时间了。有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您需要计算比较的平均值。 Oracle中最简单的方法是使用分析函数:

SELECT first_name, last_name, salary,
       (CASE WHEN salary > AVG(salary) OVER () THEN 'High-Pay' 
             WHEN salary < AVG(salary) OVER () THEN 'Low-Pay'
             ELSE 'Average' 
        END) AS CompareColumn
FROM more_employees ;

as也会追踪end的{​​{1}}。

答案 1 :(得分:1)

计算平均工资(例如使用CTE),然后在分类查询中使用它:

WITH cteSalary AS
(
  SELECT AVG(salary) as avgSalary
  FROM more_employees
)
SELECT 
  e.first_name, 
  e.last_name, 
  e.salary,
  CASE 
    WHEN e.salary > s.avgSalary THEN 'High-Pay'
    WHEN e.salary < s.avgSalary THEN 'Low-Pay'
    ELSE 'Average'
  END AS CompareColumn
FROM more_employees e CROSS JOIN cteSalary s;

SqlFiddle here