2017-11-18 12 views
1

//アップデート:提供された回答はうまくいったが、別の状況に遭遇した。学生が別のポジションに移動した場合、重複があった場合に前のポジションの完了からクレジットを保持する必要があります。以下の状況を参照してください。MySQL Show Required Class Completed

2つのトレーニングコードのそれぞれに必要な2つのコース、courseAとcourseBがあります。生徒がコースAとコースBを訓練コード10で受け取り、新しい位置(訓練コード30)に移動すると、コードが変更されたためにCourseAとCourseBが完了していないという例外が表示されます。コースは同じですが。私は説明の数を比較しようとしましたが、うまくいきません。コース名は、トレーニングテーブル上のactivityIdと上の必須トレーニングテーブルです。何かご意見は?ありがとう

私は、学生が必要なトレーニング(カリキュラム)のリストからすべてのクラスを修了したか、完了していないかを判断するMySqlスクリプトを作成しようとしています。 以下の例では、John Doeがtraininglevel 0のクラス1,2、および3を完了したことを示す必要があります。また、クラス2が存在しないため、 が完了していないことを示す必要があります。クラスに受注番号を割り当てようとしました。受注番号3(Class3)に達すると が完成しましたが、受講者がクラス2を受講しなかった場合は、ギャップがありません。レベル0の訓練を受けているかどうかを表示してください。

tbltraining

firstname 
lastname 
email 
organization 
activity 
description 
status 
jobcode 

例tbltraining

John | Doe  | [email protected] | 1233 | Class1  | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | Class2  | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | Class3  | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | OtherClass | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | OtherClass2 | Certification | Completed | 030 
Jane | Doe  | [email protected] | 3311 | Class1  | Certification | Completed | 010 
Jane | Doe  | [email protected] | 3311 | Class3  | Certification | Completed | 010 
James | Doe  | [email protected] | 1233 | Class1  | Certification | Completed | 030 
James | Doe  | [email protected] | 1233 | Class2  | Certification | Incomplete | 030 

tblreqtraining

trainingname 
trainingdescription 
trainingcode 
traininglevel 

Class1 | Certification | 30 | 0 
Class2 | Certification | 30 | 0 
Class3 | Certification | 30 | 0 
Class1 | Certification | 10 | 0 
Class2 | Certification | 10 | 0 
Class3 | Certification | 10 | 0 
Class4 | Certification | 10 | 0 
をtblreqtrainingの
  • Activityニーズが一致するtrainingdescription
  • jobcodeニーズに合わせて、trainingname
  • Descriptionニーズに合わせてtrainingcode

問合せ:この上

SELECT tra.firstname, tra.lastname, tra.email, tra.organization, tra.activity, tra.description, 
     tra.jobcode, req.trainingname, req.traininglevel, req.trainingcode 
FROM tbltraining tra 
RIGHT JOIN tblreqtraining req on tra.activity = req.trainingname and right(tra.jobcode, 2) = req.trainingcode 
WHERE (right(tra.jobcode,2) = '30' or right(tra.jobcode,2) = '10') 
and tra.description = 'Certification' 
and tra.status = 'Completed' 
and req.traininglevel = 0 

任意の考えや方向をいただければ幸いです。

+0

結果がどのように見えるかは不明です。 –

+0

私はレベル0のカリキュラムを修了していないすべての生徒のリストを表示するためにクエリを実行することができます。名前、電子メール、ジョブコード、組織。または、レベル0のカリキュラムを完了した同じ列のリスト。 – Jason

+0

'RIGHT JOIN'を使うときは、WHERE句の左のテーブルに条件を設定すべきではありません。それらは' ON'節にあるべきです。さもなければ、一致しない行からすべての 'NULL'値をフィルタリングします。これは' INNER JOIN'のようです。 – Barmar

答えて

1

各トレーニングコードのクラス数と各学習コードごとに各生徒が完了したクラスの数を取得します。学生のカウントがクラスのカウントと同じでない場合、すべてのクラスを修了しませんでした。

SELECT tra.firstname, tra.lastname, tra.trainingcode, 
     CASE IFNULL(tra.completed_count, 0) 
      WHEN req.class_count THEN 'Completed All' 
      ELSE 'Not completed' 
     END 
FROM (
    SELECT trainingcode, COUNT(*) class_count 
    FROM tblreqtraining 
    WHERE traininglevel = 0 
    GROUP BY trainingcode 
) AS req 
LEFT JOIN (
    SELECT firstname, lastname, RIGHT(jobcode, 2) AS trainingcode, COUNT(*) AS completed_count 
    FROM tbltraining AS tra 
    JOIN tblreqtraining AS req ON RIGHT(tra.jobcode, 2) = req.trainingcode AND tra.activity = req.trainingname 
    WHERE tra.description = 'Certification' AND tra.status = 'Completed' 
    AND req.traininglevel = 0 
    GROUP BY firstname, lastname, trainingcode 
) AS tra ON tra.trainingcode = req.trainingcode 
+0

はい、それは動作し始めています!しかし、LEFT JOINには、レベル調整が含まれており、レベル0のカリキュラムに含まれていない認定を含め、すべての完了した認定がカウントされています。 LEFT JOINのWHERE文に以下を追加しようとしています: WHERE description = 'Certification' AND status = 'Completed'とアクティビティ(SELECT trainingname FROM tblreqtraining where traininglevel = '0') tblreqtrainingの名前を持つ完了コースの数。 また、生徒が1つ以上のコースを修了しているので、どこかにDISTINCTが必要だと思います。 – Jason

+0

'tbltraining'サブクエリに' AND traininglevel = 0'を追加するだけです。 – Barmar

+0

2番目のサブクエリにjoinを追加したので、 'tblreqtraining'にあるクラスだけがカウントされます。 – Barmar

関連する問題