POSTGRESQL должен появиться в GROUP BY - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу выбрать случай, но получаю следующее сообщение об ошибке:

ERROR:  column "employee_view.firstname" must appear in the GROUP BY clause 
or be used in an aggregate function

sampe data из таблицы employee_view:

 e_id  | firstname | lastname  | christmas_bonus 
-------+-----------+-----------+-----------------
 10100 | Mark      | Stevens   |       7500.0000
 10101 | Alex      | Watts     |       8700.0000
 10102 | Hannah    | Burton    |       7800.0000

мой запрос:

select distinct e_id, firstname, lastname, christmas_bonus, case 
when christmas_bonus < round(avg(christmas_bonus),2) then 'bonus below average' 
else 'bonus above average' end from employee_view group by e_id;

желаемый вывод:

e_id  | firstname | lastname  | christmas_bonus | case 
------+-----------+-----------+-----------------+------
10100 | Mark      | Stevens   |       7500.0000 | bonus below average

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Для каждой строки employee_view вы хотите сравнить рождественский бонус со средним значением всех сотрудников.

Простое, эффективное и, возможно, более простое в обслуживании решение состоит в том, чтобы вычислить общее среднее значение в запросе, а затем сравнить значение с каждым бонусом сотрудника (CROSS JOIN с таблицей сотрудников).

Следовательно, среднее значение вычисляется только один раз, возвращая только одну строку данных, и вам не нужно использовать оконную функцию или группировки по предложениям.

select 
    e.e_id, 
    e.firstname,
    e.lastname, 
    e.christmas_bonus, 
    case 
        when e.christmas_bonus < a.christmas_bonus then 'bonus below average'
        else 'bonus above average' 
    end 
from 
    employee_view e
    cross join (select avg(christmas_bonus) from employee_view) a
;
0 голосов
/ 15 декабря 2018

Вы можете пропустить GROUP BY деталь и использовать вместо нее AVG:

select e_id, firstname, lastname, christmas_bonus,
   case when christmas_bonus < round((avg(christmas_bonus) OVER()),2) 
        then 'bonus below average' else 'bonus equal or above average' end 
from employee_view 
...