2017-02-10 217 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 BTW,我相信你用'通過FirstName'組來計算'avg'和'max'。 – Prisoner

回答

3

你正在做集團通過First_name,在你的餐桌,

對於NEENA,max(salary) = 17000avg(salary)=17000

所以,>=在條件匹配查詢和17000被返回。

凡與>更換>= evaulated爲NULL。

對於史蒂芬,MAX(薪水)= 24000,AVG(工資)=(24000 + 2200)/ 2 = 13100

所以更換>=<返回13100

注:通過的ColumnName分組這裏first_name在這裏扮演關鍵角色 。 SELECT中的所有聚合函數以及子句 均適用於每個員工,而不是整個表。

+0

TJ如何不是他/她的最大(工資)= 2100和平均(工資)= 2100。還有其他這樣的員工。 –

+0

您選擇了max(平均工資)'17000 –

+0

因此,您的意思是max(工資)在這種情況下計算爲max(平均工資)? 另外,對於詹姆斯max(薪水)= 2500,avg(薪水)= 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 
;