使用聚合函数sql查找计数

使用聚合函数sql查找计数,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,对于给定的数据,我需要找出工资低于平均工资的id计数 id salary 1 11 2 12 2 14 1 12 1 13 1 14 1 15 所以我的最终输出是这样的 id count 1 2 2 1 [id 1的平均薪资为13,id 2的平均薪资为13。因此,id 1中有两个值小于id 2的平均薪资]使用COUNT*分组要计数,请检查其中

对于给定的数据,我需要找出工资低于平均工资的id计数

id  salary
1   11
2   12 
2   14
1   12
1   13
1   14
1   15
所以我的最终输出是这样的

id count 
  1   2
  2   1

[id 1的平均薪资为13,id 2的平均薪资为13。因此,id 1中有两个值小于id 2的平均薪资]

使用COUNT*分组要计数,请检查其中
select id, count(*)
from tablename
where salary < (select avg(salary) from tablename)
group by id
此查询将为每个ID提供低于平均薪资的薪资计数。
希望您只需要此功能。

我倾向于使用窗口功能:

select id, count(*) as cnt
from (select t.*, avg(salary) over (partition by id) as avgs
      from table t
     ) t
where salary < avgs
group by id;

您使用的是哪个版本的Oracle?您将其标记为11g和10G,因为它与ORA-00979错误:having子句中的工资上没有GROUP BY表达式?因此需要select中的countsalary?不,您需要在筛选行之前计算出平均值。也就是说,不能只在having子句中这样做,因为它涉及到聚合列,而salary不是其中之一。就像其他两个建议的答案一样。
select id, count(*) as cnt
from (select t.*, avg(salary) over (partition by id) as avgs
      from table t
     ) t
where salary < avgs
group by id;