Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 与具有从句的行为相混淆_Sql_Group By_Having - Fatal编程技术网

Sql 与具有从句的行为相混淆

Sql 与具有从句的行为相混淆,sql,group-by,having,Sql,Group By,Having,我无法理解以下查询的行为: select max(avg(salary)) from employees group by first_name having avg(salary) >= max(salary); 它将结果打印为17000。但是如果max(salary)是24000就不应该有空结果。如果我用“>”替换“>=”,它将结果打印为NULL 如果我在您的表中将“>=”替换为“您正在按名字进行分组” 对于Neena,max(salary)=17000和avg(salary)=17

我无法理解以下查询的行为:

select max(avg(salary)) from employees
group by first_name
having avg(salary) >= max(salary);
它将结果打印为17000。但是如果max(salary)是24000就不应该有空结果。如果我用“>”替换“>=”,它将结果打印为NULL


如果我在您的表中将“>=”替换为“您正在按
名字进行分组”

对于Neena,
max(salary)=17000
avg(salary)=17000

因此,
=
匹配查询中的条件,并返回
17000

其中,将
>=
替换为
计算为空

对于Steven,最高工资=24000,平均工资=24000+2200)/2=13100


因此,如果你想比较一名员工的平均工资(这真的有意义吗?一名员工在一个时间点上肯定只有一份工资?),那么将
=
替换为
,这可能会有所帮助

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
;

你想在这里做什么?用简单的英语描述你想得到的输出。10行样本数据通常就足够了。同时向我们展示预期结果-因为我无法理解你想要什么。你可以检查
avg(salary)>=max(salary)
avg(salary)=max(salary)
,结果应该是一样的。例如,如果你只有一条记录,比如说3000条,那么
avg
max
都是3000条。顺便说一句,我相信你使用
group by FirstName
来计算
avg
max
avg
上的
max
?这是Oracle吗?这是我所知道的唯一一个数据库管理系统吗g这个快捷语法。至于答案:见麻省理工学院巴特的解释。对于每个唯一的名字
AVG
=
MAX
。额外的
MAX
可以让你得到最大值。我的问题是:为什么打印出17000,而As MAX(salary)是24000。TJ不是他/她的MAX(salary)=2100和AVG(salary)呢=2100。还有其他这样的员工。您选择了
max(avg(salary))
它是17000,所以您的意思是,在这种情况下,max(salary)的计算结果是max(avg(salary))?另外,对于James max(salary)=2500,avg(salary)=2450。因此,即使是James,也似乎是在
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
;