2017-02-10 202 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 
;