2017-02-10 12 views
1

Я не могу понять поведение следующего запроса:Путаница с поведением предложения HAVING

select max(avg(salary)) from employees 
group by first_name 
having avg(salary) >= max(salary); 

Она выводит результат как . Но если max (зарплата) не должно быть пустым результатом. Если я заменил ""> = "" на ">", он печатает результат как NULL.

И если я заменил «> =» на «<», тогда в результате напечатано 13100.

Ниже сотрудники таблице:

 
TJ  2100 
Steven 2200 
Hazel 2200 
James 2400 
Ki  2400 
Karen 2500 
James 2500 
Joshua 2500 
Peter 2500 
Martha 2500 
Randall 2500 
Guy  2600 
Randall 2600 
Donald 2600 
Douglas 2600 
Irene 2700 
John 2700 
Sigal 2800 
Mozhe 2800 
Girard 2800 
Vance 2800 
Shelli 2900 
Michael 2900 
Timothy 2900 
Anthony 3000 
Kevin 3000 
Alex 3100 
Curtis 3100 
Jean 3100 
Alana 3100 
Julia 3200 
Stephen 3200 
Winston 3200 
Samuel 3200 
Laura 3300 
Jason 3300 
Julia 3400 
Trenna 3500 
Renske 3600 
Jennife 3600 
Kelly 3800 
Britney 3900 
Sarah 4000 
Alexis 4100 
Diana 4200 
Nandita 4200 
Jennife 4400 
David 4800 
Valli 4800 
Kevin 5800 
Bruce 6000 
Pat  6000 
Sundita 6100 
Amit 6200 
Charles 6200 
Sundar 6400 
Shanta 6500 
Susan 6500 
David 6800 
Luis 6900 
Oliver 7000 
Sarath 7000 
Kimbe 7000 
Mattea 7200 
Eliza 7300 
William 7400 
Nanette 7500 
Louise 7500 
Ismael 7700 
Jose 7800 
Payam 7900 
Matthew 8000 
Christ 8000 
Lindsey 8000 
John 8200 
Adam 8200 
William 8300 
Jack 8400 
Jonath 8600 
Alyssa 8800 
Alex 9000 
Daniel 9000 
Peter 9000 
Allan 9000 
Patrick 9500 
Danie 9500 
David 9500 
Tayler 9600 
Hermann 10000 
Harris 10000 
Janette 10000 
Peter 10000 
Clara 10500 
Eleni 10500 
Gerald 11000 
Den  11000 
Ellen 11000 
Lisa 11500 
Alberto 12000 
Shelley 12008 
Nancy 12008 
Michael 13000 
Karen 13500 
John 14000 
Lex  17000 
Neena 17000 
Steven 24000 

+0

Что вы пытаетесь здесь? На простом английском языке, _describe_, какой результат вы пытаетесь получить. –

+0

Обычно достаточно 10 рядов выборочных данных. Также покажите нам ожидаемый результат - потому что я не могу понять, что вы хотите. – jarlh

+0

Вы можете проверить 'avg (зарплата)> = max (зарплата)' и 'avg (зарплата) = max (зарплата)', результат должен быть таким же. Например, если у вас есть только 1 запись - скажем 3000, то оба 'avg' и' max' равны 3000. Кстати, я считаю, что вы используете 'group by FirstName' для вычисления' avg' и 'max'. – Prisoner

ответ

3

Вы делаете Группировать по First_name, в таблице,

Для Neena, max(salary) = 17000 и avg(salary)=17000,

Итак, >= соответствует условию запрос и 17000.

Где заменяем >= на > эвакуируется до NULL.

для Стивена, Max (заработной платы) = 24000, AVG (заработной платы) = (24000 + 2200)/2 = 13100

Так замена >= с < возвращается 13100

Примечание: Группировка по ColumnName здесь first_name играет ключевую роль здесь. Все агрегированные функции в SELECT, а также предложение, , применяются для каждого сотрудника, а не для всей таблицы.

+0

Как насчет TJ не его/ее макс (зарплата) = 2100 и средняя (зарплата) = 2100. И есть и другие такие сотрудники. –

+0

Вы выбрали 'max (avg (зарплата))', который равен 17000 –

+0

Итак, вы имеете в виду, что max (зарплата) в этом случае оценивается как max (avg (зарплата))? Кроме того, для Джеймса Макс (зарплата) = 2500, средняя зарплата = 2450.Поэтому даже Джеймс кажется кандидатом на выпуск в случае <. –

0

Если вы хотите сравнить среднюю зарплату работника (делает это действительно имеет смысл? Конечно, работник имеет только одну зарплату в определенный момент времени?), То это может помочь

WITH 
employees (first_name,salary) 
AS 
    (SELECT 'TJ',2100 FROM dual UNION ALL 
    SELECT 'Steven',2200 FROM dual UNION ALL 
    SELECT 'Hazel',2200 FROM dual UNION ALL 
    SELECT 'James',2400 FROM dual UNION ALL 
    SELECT 'Ki',2400 FROM dual UNION ALL 
    SELECT 'Karen',2500 FROM dual UNION ALL 
    SELECT 'James',2500 FROM dual UNION ALL 
    SELECT 'Joshua',2500 FROM dual UNION ALL 
    SELECT 'Peter',2500 FROM dual UNION ALL 
    SELECT 'Martha',2500 FROM dual 
) 
SELECT 
first_name 
,mean_salary_all_emps 
,AVG(salary) 
FROM 
(SELECT 
    first_name 
    ,salary 
    ,AVG(salary) OVER() mean_salary_all_emps 
    FROM 
    employees 
) 
WHERE 1=1 
GROUP BY 
first_name 
,mean_salary_all_emps 
HAVING AVG(salary) > mean_salary_all_emps 
;