出勤率低于平均水平的 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 查找组的主要内容,如果未能解决你的问题,请参考以下文章