2017-09-05 12 views
1

サブクエリを設定しようとしていますが、集計/グループ化に問題があります。サブクエリは、平均値に基づいてカウントを選択します。ただし、 WHEREブロックにAVG(response) >= target条件を設定すると、「グループ関数の無効な使用」エラーが発生します。サブクエリのHAVINGブロックに条件を配置するには、ターゲット変数が、のSELECTブロックにCOUNTを指定する必要があることを除き、演算子には1列が含まれている必要があります。クエリのコピーは以下のとおりです。MySQLネストされたクエリHAVINGフィールド

私はネストされたクエリと集合関数の両方に精通していますが、この特定の組み合わせは協力を拒否しています。 "比較のためにこのフィールドを選択する/ HAVINGを返すが、それを返さない"ためのキーワードが必要であるかのように思えるかもしれません。残念ながら、これはBIRTレポーティングソフトウェアによって実行されているので、(自分の知る限りでは)生データを取得して手動で集計することはできません。

クエリが(少しわかりやすくするために剪定)以下である:

SELECT 
    c.job_competency_id, 
    (
     SELECT 
      COUNT(ar1.assessment_result_id) 
     FROM 
      recent_assessment AS ra1, 
      assessment_result AS ar1, 
      client_job_competency AS jc1 
     WHERE 
      ar1.assessment_id = a.assessment_id 
      AND ra1.assessment_id = ar1.assessment_id 
      AND ar1.job_competency_id = jc1.job_competency_id 
      AND ar1.job_competency_id = c.job_competency_id 
      AND AVG(ar1.response) >= jc1.target 
     GROUP BY jc1.job_competency_id 
    ) AS n_meets 
FROM 
    recent_assessment AS ra, 
    assessment AS a, 
    assessment_result AS ar, 
    client_job_competency AS jc, 
    job_competency AS c, 
    master_competency AS mc 
WHERE 
    a.client_id = ? 
    AND ra.assessment_id = a.assessment_id 
    AND ar.assessment_id = a.assessment_id 
    AND c.job_competency_id = ar.job_competency_id 
    AND c.master_competency_id = mc.master_competency_id 
    AND jc.job_competency_id = c.job_competency_id; 

それが重要場合には、代替サブクエリはここにある:

(
     SELECT 
      COUNT(ar1.assessment_result_id), 
      jc1.target 
     FROM 
      recent_assessment AS ra1, 
      assessment_result AS ar1, 
      client_job_competency AS jc1 
     WHERE 
      ar1.assessment_id = a.assessment_id 
      AND ra1.assessment_id = ar1.assessment_id 
      AND ar1.job_competency_id = jc1.job_competency_id 
      AND ar1.job_competency_id = c.job_competency_id 
     GROUP BY jc1.job_competency_id 
     HAVING AVG(ar1.response) >= jc1.target 
    ) AS n_meets 

あなたがここまで読めば、撮影のためにあなたに感謝一見。明確化が必要なことがあれば教えてください。うまくいけば、私はちょうど骨折したミスをどこかにした。

+0

これは相関サブクエリなので、常に1行を返す必要があります。なぜそれをフィルタリングするために 'HAVING'を使う必要がありますか? – Barmar

答えて

0

WHERE句に集約関数を使用することはできません。すべての行が選択されるまで集約を処理しないためです。これはWHERE節と同じです。

HAVINGの問題を解決するには、比較する列を選択する必要があります。別のレベルのサブクエリでラップすることができます。次に、外部クエリは、SELECTリストに入れたい1列を返します。

(SELECT n_meets 
FROM (
    SELECT 
     COUNT(ar1.assessment_result_id) AS n_meets, 
     jc1.target 
    FROM 
     recent_assessment AS ra1, 
     assessment_result AS ar1, 
     client_job_competency AS jc1 
    WHERE 
     ar1.assessment_id = a.assessment_id 
     AND ra1.assessment_id = ar1.assessment_id 
     AND ar1.job_competency_id = jc1.job_competency_id 
     AND ar1.job_competency_id = c.job_competency_id 
    GROUP BY jc1.job_competency_id 
    HAVING AVG(ar1.response) >= jc1.target 
) AS x) AS n_meets 
関連する問題