2014-10-21 4 views
0

Я искал это и нашел несколько ссылок на форумах здесь, но ни один из них, который я чувствовал, не применял к моему вопросу, или, похоже, имел тот же результат, что и мой. Что мне нужно сделать, это ...CASE in Aggregate Functions

Список всех сотрудников фамилии, имени, зарплаты и столбца «Сравнить столбца» из таблиц more_employees, если зарплата больше, чем средняя зарплата, этот столбец «Высокая оплата», другой выход «Low-Pay»

То, что я разработал это ...

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 

ошибки я получаю то, что это

«не одногрупповая группа функция "

поэтому я добавляю в группе в конце с кем-либо одним из имен столбцов, то я получаю

«Не групповая функция»

и поэтому я застрял и был на некоторое время теперь. Есть идеи?

+0

Вы читали http://stackoverflow.com/questions/1520608/ora-00979-not-a-group-by-expression? – Ben

+0

взять first_name, last_name, заработать cols в группе и будет работать нормально, но исправить «случай, когда» сначала – Thomas

+0

всегда, когда u получить ошибку «not group by expression» означает, что вы пропустили столбец из группы по статье – Thomas

ответ

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 для case.

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