1

2つの別々のテーブルから2つの異なる時間の平均時間差を選択するために必要なクエリがあります。

クエリの次の部分が来るまで、それは簡単に思えました。学生がオフィスに来る理由でグループ化する必要があります。したがって、このクエリは次のことを行う必要があります。

  1. 理由を選択してください(理由)
  2. その理由で学生が何回来たかを数えます(なぜ)
  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;

ただし、エラーが発生します:

エラー1111(HY000):グループ関数の使用が無効です

私はこの問題を理解していないようです。過去の質問を読んで、彼らは持っていることを使うことを考えていますか?しかし、この状況で、have句をどこに追加するのか、どこに追加するのかさえわかりません。

どんな助けでも大歓迎です。

ありがとうございました

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

わかりました、これを少し見てみると、最大サポート レコードを取得するためのネストされたクエリが必要だと思います。

これを行う1つの方法は次のとおりです。

 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 に答える