Я получаю сообщение об ошибке при использовании функции Aggregate mySQL - PullRequest
0 голосов
/ 16 апреля 2020

Любые мысли о том, почему следующее не работает. Таблица называется «Доходы», в ней есть 3 столбца: имя, отдел и зарплата. Я хочу получить имя и зарплату сотрудника отдела маркетинга, чья зарплата меньше, чем средняя зарплата всех сотрудников. Когда я запускаю следующее, я получаю ОШИБКУ 1111.

SELECT name, salary
FROM income
WHERE dept = "marketing"
HAVING salary < AVG(salary)

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

В качестве альтернативы помещению подзапроса в предложении WHERE мы могли бы использовать встроенное представление:

SELECT t.name
     , t.salary
  FROM ( SELECT AVG(d.salary) AS avg_salary
           FROM income d
          WHERE d.dept = 'marketing'
       ) a
  JOIN income t
    ON t.salary > a.avg_salary
   AND t.dept   = 'marketing'

При встроенном представлении мы также можем вернуть среднюю зарплату и вычислить разницу даже разница в процентах для нескольких отделов

Немного расширив запрос, примерно так:

SELECT a.dept
     , t.name
     , t.salary
     , a.avg_salary
     , ((t.salary - a.avg_salary) / a.avg_salary) * 100.0 AS pct_greater 
  FROM ( SELECT d.dept
              , AVG(d.salary) AS avg_salary
           FROM income d
          GROUP
             BY d.dept
       ) a
  JOIN income t
   AND t.dept   = a.dept
    ON t.salary > a.avg_salary
 ORDER
    BY a.dept
     , t.salary DESC
1 голос
/ 16 апреля 2020

Вы должны использовать подзапрос в предложении WHERE, который возвращает среднее значение:

SELECT name, salary
FROM income
WHERE dept = 'marketing'
AND salary < (SELECT AVG(salary) FROM income WHERE dept = 'marketing') 

Если под всех сотрудников вы подразумеваете среднюю зарплату сотрудников всех отделов, то удалите WHERE dept = 'marketing' из подзапроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...