1

我有一个查询,我需要它从两个单独的表中选择两个不同时间的平均时间差。

这似乎很容易,直到查询的下一部分出现:我必须按照学生进入办公室的原因进行分组。所以现在这个查询需要:

  1. 选择原因(why)
  2. 计算一个学生因为这个原因进来了多少次 count(why)
  3. 然后我需要检查从开始时间到结束时间的 AVG 时间。请记住,我是按原因分组的。这意味着我需要 timediff 来计算属于学生访问原因的所有记录的差异。

我写了这个查询:

 SELECT why, 
    count(why), 
    SEC_TO_TIME(AVG(MAX(support.finishtime) - session.signintime)) 
    FROM session 
    LEFT JOIN support  
        ON support.session_id = session.session_id  
    WHERE status = 3  
    GROUP BY why;

但是我收到一个错误:

ERROR 1111 (HY000): 组函数使用无效

我似乎不明白这个问题。从阅读过去的问题,他们正在考虑使用有?但我不明白在这种情况下如何或什至在哪里添加having子句。

任何帮助将非常感激。

谢谢

4

2 回答 2

1
SELECT 
session.why AS Reason, 
COUNT(session.why) AS Count, 
SEC_TO_TIME(AVG(TIMEDIFF(t.fin, session.signintime))) AS Time
FROM session 
LEFT JOIN (SELECT support.session_id, MAX(support.finishtime) AS fin 
FROM support 
GROUP BY support.session_id) AS t 
    ON session.session_id = t.session_id 
WHERE session.status = 3  
GROUP BY session.why 
ORDER BY session.signintime DESC

这完美地完成了工作!我几个小时前才拿到它,我从来没有真正处理过子查询,所以我的教授帮我解决了这个问题。

于 2013-02-06T17:19:04.637 回答
0

好的,稍微看一下,我想你想要的是一个嵌套查询来获取最大支持记录。

一种方法是:

 SELECT why, 
    count(why), 
    SEC_TO_TIME(AVG((select max(finishtime) from 
              support where support.session_id = session.session_id) -
        session.signintime))
    FROM session 
    WHERE status = 3  
    GROUP BY why;

我创建了一个SQL Fiddle,因此您可以查看我使用的表结构。

于 2013-02-03T03:00:18.583 回答