используя оператор в предложении.ОШИБКА - PullRequest
0 голосов
/ 29 мая 2018
set @mte := (select max(salary * months) from employee);

select count(name), salary*months
from employee
group by salary*months
having salary*months = @mte;

Это компилируется с ошибкой

ОШИБКА 1054 (42S22) в строке 12: Неизвестный столбец 'зарплата' в 'имеющем предложение' PS: Woud хотел бы использовать имеющийся пункт вместо где,Я учусь на экспериментах.Хотелось бы узнать, почему это не работает PS: ИСПОЛЬЗУЯ MYSQL LATEST

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Обычно то, что вы делаете, должно быть в порядке;HAVING должен иметь возможность работать с агрегированными результатами и любыми полями, сгруппированными (по крайней мере, по мере того, как они группируются, в данном случае как salary*months).Кажется, что MySQL пытается пересчитать этот продукт из значений отдельных полей (к которым он больше не имеет доступа на этом этапе.)

Попробуйте создать псевдоним salary*months и использовать псевдоним в GROUP BY и HAVING..

... но, как было сказано в комментариях, такое условие должно быть выполнено в ГДЕ в любом случае;и может быть сделано в одном запросе:

select count(name), salary*months AS some_product
from employee
WHERE salary*months = (select max(salary * months) from employee)
group by some_product;
0 голосов
/ 29 мая 2018

Самое простое решение не использует переменную или подзапрос:

select count(name), salary*months as tot
from employee
group by salary*months
order by tot desc
limit 1;

Вы также можете исправить свою версию, используя псевдоним:

select count(name), salary*months as tot
from employee
group by salary*months
having tot = @mte;

Или используя функцию агрегирования:

having max(salary*months) = @mte;

Я думаю, вы могли найти ошибку синтаксического анализа в MySQL.Ваша версия должна работать, но, очевидно, выражение разлагается на ссылки на столбцы - и MySQL считает, что их нужно агрегировать.

0 голосов
/ 29 мая 2018

Попробуйте использовать здесь перекрестное применение и замените на выражение where:

set @mte := (select max(salary * months) from employee);

select count(name), SalMonth
from employee cross apply (select salary*months SalMonth)a
where SalMonth = @mte
group by SalMonth;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...