出勤率低于平均水平的 SQL 查找组

Posted

技术标签:

【中文标题】出勤率低于平均水平的 SQL 查找组【英文标题】:SQL Finding Group where attendance less than average 【发布时间】:2017-05-03 21:50:56 【问题描述】:

我怎样才能使参加人数低于平均水平?这是我的 Oracle 查询

SELECT e.event_id EventID,c.concert_name ConcertName, c.concert_date, 
AVG(e.attendance) Attendance

FROM event e INNER JOIN concert c ON c.concert_id = e.concert_id 
WHERE  Attendance - AVG(e.Attendance)
GROUP BY c.concert_id ASC;

【问题讨论】:

这是有效的,但其中一行显示出勤率高于平均水平。有什么问题? 【参考方案1】:

使用AVG(..) OVER () 分析函数(并且没有相关子查询):

SELECT eventId,
       ConcertName,
       Concert_Date
FROM   (
  SELECT e.event_id EventID,
         c.concert_name ConcertName,
         c.concert_date,
         e.attendance,
         AVG(e.attendance) OVER () AS avg_Attendance
  FROM   event e
         INNER JOIN concert c
         ON c.concert_id = e.concert_id
)
WHERE  attendance < avg_attendance;

【讨论】:

AVG FROM dual(e.attendance) OVER () AS avg_Attendance * 第 9 行出现错误:ORA-00907:缺少右括号。 * 就在 e.attendance 之前 @user3346221 谢谢。已修复,该行之前缺少逗号。 它可以工作,但是当我尝试在 select 语句中选择其他字段时出现错误。我修改第一部分如下比较 SELECT eventId, ConcertName, Concert_Date, Attendance, AVG(Attendance) Error: SELECT eventId, * ERROR at line 1: ORA-00937: not a single-group group function Error near eventid @user3346221 使用已在内部查询中计算的avg_attendance,而不是尝试在外部查询中使用聚合函数AVG 重新计算。【参考方案2】:

你可以这样试试:

SELECT e.event_id EventID,c.concert_name ConcertName, c.concert_date, 
AVG(e.attendance) Attendance
FROM event e INNER JOIN concert c ON c.concert_id = e.concert_id 
WHERE  e.attendance < (select AVG(ev.attendance) from event ev)
GROUP BY c.concert_id ASC;

【讨论】:

以上是关于出勤率低于平均水平的 SQL 查找组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 分析函数选择工资低于部门平均水平的员工?

SQL查询查找组长的出勤率应该大于avg。出席率 占HIS组所有成员的百分比

查找总成本低于平均 SQL

SQL选择所有ID的高于平均水平

在球员计分计划中显示低于平均分

平均数 中位数 众数的实际意义