2017-12-14 4 views
0

私は、スポーツや学校での活動に参加した学生の毎日の出席(期間1〜10)を取得する以下の問合せを持っています。私はその期間のうちの少なくとも1つの欠席の学生を見たいと思うので、すべての期間の出席コードがNULLの場合、出席してはいけません。私はどのようにクエリにそれを追加するか分からない。誰も助けることができますか?Oracle SQL問合せヘルプ - 学生の出席

SELECT DISTINCT 
     s.student_number AS "Student Number", 
     s.lastfirst AS "Student Name", 
     DECODE(s.grade_level,-1,'PK',0,'KG',s.grade_level) AS "Grade", 
     s.home_phone AS "Phone", 
     DECODE(s.schoolid,280050,'Kodiak High School',s.schoolid) AS "School", 
     (SELECT DISTINCT co.course_name FROM ps.courses WHERE co.course_number=se.course_number AND se.course_number LIKE 'CLB%' OR se.course_number LIKE 'ACT%') AS "Course Name", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='1') AS "Per. 1", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='2') AS "Per. 2", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='3') AS "Per. 3", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='4') AS "Per. 4", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='5') AS "Per. 5", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='6') AS "Per. 6", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='7') AS "Per. 7", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='8') AS "Adv", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='9') AS "Act", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='10') AS "Clb" 

     FROM attendance att 
     JOIN students s ON s.id=att.studentid 
     INNER JOIN cc ON s.ID=cc.studentid 
     INNER JOIN sections se ON cc.sectionid = se.id 
     JOIN courses co ON co.course_number=se.COURSE_NUMBER 

     WHERE att.att_date=to_date(SYSDATE) 
     AND att.schoolid in '280050' 
     AND s.enroll_status=0 
     AND cc.termid = 2700 
     AND se.course_number LIKE 'ACT%'OR se.course_number LIKE 'CLB%' 

     ORDER BY s.lastfirst 

ここにデータのサンプルを示します。私はすべてのピリオドがNULLのときに行を見たくない。彼らに欠席コードがある場合のみ。私はあなたが扱っているデータについては非常に非常に少しを知っている一方で、私は出発点としてこれを提案したいData Sample

+0

Yikes!以下を参照してください:「いくつかのシンプルなSQLルールを使用する」(http://weblogs.sqlteam.com/jeffs/archive/2006/03/14/9289.aspx)および/または [なぜ私はDISTINCTが嫌いなのですか?(http://weblogs.sqlteam.com/markc/archive/2008/11/11/60752.aspx)& "decode"は学ぶのには大したことではありません。好ましい。あなたは 'group by'節と' having'節が必要ですが、私はそれを言って残念ですが、 "新鮮なもの" –

+0

'pssis_attendance_meeting'テーブルからのデータのサンプルを(テキストではなくテキストで)見ることができますか?ご質問ください。包括的な回答が必要な場合は、他のテーブルのデータのサンプルも役立ちます。 –

+0

質問の中で見栄えの良いように表を書式設定するには、各行の左側に4つのスペースが必要です。または、ツールバーのこのボタン「{}」を使用してください。あなたはいつでもサイトの使い方のヒントについては、脚注のヘルプリンクを見ることができます。 –

答えて

0

明らかに私はあなたが思ったことを理解していません。ビットのようになります。新しいクエリを作る私はを提供しているものを取る:

SELECT 
     s.*, att.* -- choose which columns you want, form these sources or other you can add to it 
from students AS s 
INNER JOIN (
      SELECT 
        studentid 
        , max(case when period_number='1' then attcodes end) per1 
        , max(case when period_number='2' then attcodes end) per2 
        , max(case when period_number='3' then attcodes end) per3 
        , max(case when period_number='4' then attcodes end) per4 
        , max(case when period_number='5' then attcodes end) per5 
        , max(case when period_number='6' then attcodes end) per6 
        , max(case when period_number='7' then attcodes end) per7 
        , max(case when period_number='8' then attcodes end) per8 
        , max(case when period_number='9' then attcodes end) per9 
        , max(case when period_number='10' then attcodes end) per10 
      FROM (
        SELECT 
          attm.studentid 
         , attm.period_number 
         , listagg(attm.att_code,'|') within group (order by attm.att_code) attcodes 
        FROM pssis_attendance_meeting attm 
        WHERE attm.att_date=to_date('14-Dec-2017') 
        AND attm.att_code IS NOT NULL 
        GROUP BY 
          attm.studentid 
         , attm.period_number 
       ) d 
      GROUP BY 
        studentid 
    ) AS att on s.studentid = att.studentid 

あなたは、あなたがしたい列を選択し、あなたが好きな場所を形成していますが、私はあなたを与えているサブクエリを使用している場合、 INNER JOINを使用して、 "not null"問題を解決します。

ご理解ください。

+0

これは私の答えがあなたにつながるはずのものです。新しいクエリを作成します。既存のクエリを変更しないでください。必要な余分な列を追加するだけです。これはこの質問に対する私の最後のコメントです。もしあなたが私の答えを削除しなければならない。申し訳ありませんが、私の見解では十分です。 –

+0

ありがとうございました。私はあなたが言っていることを理解していますが、非常に基本的なSQLの知識を持っている人にとっては、非常に多くのテーブルに加わる必要があるときに、私が望む結果を得るのは少し難しいです。動揺する必要はありません。私は私が再び投稿し、うまくいけば誰かが助けることができるようになったらそれを理解しようとします。 – Debora

0

SELECT 
     studentid 
     , max(case when period_number='1' then attcodes end) per1 
     , max(case when period_number='2' then attcodes end) per2 
     , max(case when period_number='3' then attcodes end) per3 
     , max(case when period_number='4' then attcodes end) per4 
     , max(case when period_number='5' then attcodes end) per5 
     , max(case when period_number='6' then attcodes end) per6 
     , max(case when period_number='7' then attcodes end) per7 
     , max(case when period_number='8' then attcodes end) per8 
     , max(case when period_number='9' then attcodes end) per9 
     , max(case when period_number='10' then attcodes end) per10 
FROM (
     SELECT 
       attm.studentid 
      , attm.period_number 
      , listagg(attm.att_code,'|') within group (order by attm.att_code) attcodes 
     FROM pssis_attendance_meeting attm 
     WHERE attm.att_date=to_date(SYSDATE) 
     AND attm.att_code IS NOT NULL 
     GROUP BY 
       attm.studentid 
      , attm.period_number 
    ) d 
GROUP BY 
     studentid 
; 

これは、出席コードの10列を持つ学生ごとに1行を生成します。私はあなたがなぜ単一の期間のために複数の出席コードを持っているのか分からないが、あなたがそうした場合に備えてlistagg()の使用を続けた。

このクエリでは、ロジックは、その日に登録された出席コードがない生徒を削除します。

これが全体の解決策に役立つことを願っています。


編集

SQL Fiddle

Oracleの11グラムR2スキーマのセットアップ

CREATE TABLE PSSIS_ATTENDANCE_MEETING 
    (NAME varchar2(15), STUDENT_NUMBER int 
    , CURRENT_GRADE_LEVEL int 
    , CURRENT_SCHOOL_ABBREVIATION varchar2(3) 
    , GENDER varchar2(1) 
    , ETHNICITY_NAME varchar2(4), ETHNICITY_CODE int 
    , SPECIAL_ED_STUDENT varchar2(2), ID int, STUDENTID int, SCHOOLID int 
    , ATT_DATE timestamp, ATTENDANCE_CODEID int, ATT_CODE varchar2(3) 
    , ATT_MODE_CODE varchar2(15), ATT_INTERVAL int, CALENDAR_DAYID int 
    , CCID int, ATT_COMMENT int, CC_SCHOOLID int, DROPPED int, PERIODID int 
    , PERIOD_ABBREVIATION varchar2(2), PERIOD_NUMBER int, SECTIONID int 
    , SECTION_NUMBER int, PROGRAMID int, PROGRAM_NAME int, TRACK_A int 
    , TRACK_B int, TRACK_C int, TRACK_D int, TRACK_E int, TRACK_F int 
    , INSESSION int, COUNT_FOR_ADA int, PRESENCE_STATUS_CD varchar2(6) 
    , CYCLE_DAY_ID int, CYCLE_DAY_ABBREVIATION varchar2(2), TOTAL_MINUTES int) 
; 

INSERT ALL 
    INTO PSSIS_ATTENDANCE_MEETING (NAME, STUDENT_NUMBER, CURRENT_GRADE_LEVEL, CURRENT_SCHOOL_ABBREVIATION, GENDER, ETHNICITY_NAME, ETHNICITY_CODE, SPECIAL_ED_STUDENT, ID, STUDENTID, SCHOOLID, ATT_DATE, ATTENDANCE_CODEID, ATT_CODE, ATT_MODE_CODE, ATT_INTERVAL, CALENDAR_DAYID, CCID, ATT_COMMENT, CC_SCHOOLID, DROPPED, PERIODID, PERIOD_ABBREVIATION, PERIOD_NUMBER, SECTIONID, SECTION_NUMBER, PROGRAMID, PROGRAM_NAME, TRACK_A, TRACK_B, TRACK_C, TRACK_D, TRACK_E, TRACK_F, INSESSION, COUNT_FOR_ADA, PRESENCE_STATUS_CD, CYCLE_DAY_ID, CYCLE_DAY_ABBREVIATION,TOTAL_MINUTES) 
     VALUES ('used_by_already', 999999, 1, 'OHS', 'F', NULL, 6, 'No', 7240947, 40576, 280100, '14-Dec-2017 12:00:00 AM', 4345, 'EXA', 'ATT_ModeMeeting', 0, 97488, 790700, NULL, 280100, 0, 5731, 'AM', 1, 66373, 1, 0, NULL, 1, 1, 1, 1, 1, 1, 1, 1, 'Absent', 3214, 'TH', 0) 
    INTO PSSIS_ATTENDANCE_MEETING (NAME, STUDENT_NUMBER, CURRENT_GRADE_LEVEL, CURRENT_SCHOOL_ABBREVIATION, GENDER, ETHNICITY_NAME, ETHNICITY_CODE, SPECIAL_ED_STUDENT, ID, STUDENTID, SCHOOLID, ATT_DATE, ATTENDANCE_CODEID, ATT_CODE, ATT_MODE_CODE, ATT_INTERVAL, CALENDAR_DAYID, CCID, ATT_COMMENT, CC_SCHOOLID, DROPPED, PERIODID, PERIOD_ABBREVIATION, PERIOD_NUMBER, SECTIONID, SECTION_NUMBER, PROGRAMID, PROGRAM_NAME, TRACK_A, TRACK_B, TRACK_C, TRACK_D, TRACK_E, TRACK_F, INSESSION, COUNT_FOR_ADA, PRESENCE_STATUS_CD, CYCLE_DAY_ID, CYCLE_DAY_ABBREVIATION,TOTAL_MINUTES) 
     VALUES ('used_by_already', 999999, 1, 'OHS', 'F', NULL, 6, 'No', 7240948 
       , 40576, 280100, '14-Dec-2017 12:00:00 AM', 4345 
       , 'EXA', 'ATT_ModeMeeting', 0, 97488, 790696, NULL 
       , 280100, 0, 5732, 'PM', 2, 66427, 1, 0, NULL 
       , 1, 1, 1, 1, 1, 1, 1, 1, 'Absent', 3214, 'TH' 
       , 0) 
SELECT * FROM dual 
; 

クエリ1

 SELECT 
       attm.studentid 
      , attm.period_number 
      , listagg(attm.att_code,'|') within group (order by attm.att_code) attcodes 
     FROM pssis_attendance_meeting attm 
     WHERE attm.att_date=to_date('14-Dec-2017') 
     AND attm.att_code IS NOT NULL 
     GROUP BY 
       attm.studentid 
      , attm.period_number 
; 

Results

| STUDENTID | PERIOD_NUMBER | ATTCODES | 
|-----------|---------------|----------| 
|  40576 |    1 |  EXA | 
|  40576 |    2 |  EXA | 

クエリ2

SELECT 
     studentid 
     , max(case when period_number='1' then attcodes end) per1 
     , max(case when period_number='2' then attcodes end) per2 
     , max(case when period_number='3' then attcodes end) per3 
     , max(case when period_number='4' then attcodes end) per4 
     , max(case when period_number='5' then attcodes end) per5 
     , max(case when period_number='6' then attcodes end) per6 
     , max(case when period_number='7' then attcodes end) per7 
     , max(case when period_number='8' then attcodes end) per8 
     , max(case when period_number='9' then attcodes end) per9 
     , max(case when period_number='10' then attcodes end) per10 
FROM (
     SELECT 
       attm.studentid 
      , attm.period_number 
      , listagg(attm.att_code,'|') within group (order by attm.att_code) attcodes 
     FROM pssis_attendance_meeting attm 
     WHERE attm.att_date=to_date('14-Dec-2017') 
     AND attm.att_code IS NOT NULL 
     GROUP BY 
       attm.studentid 
      , attm.period_number 
    ) d 
GROUP BY 
     studentid 

Results

| STUDENTID | PER1 | PER2 | PER3 | PER4 | PER5 | PER6 | PER7 | PER8 | PER9 | PER10 | 
|-----------|------|------|--------|--------|--------|--------|--------|--------|--------|--------| 
|  40576 | EXA | EXA | (null) | (null) | (null) | (null) | (null) | (null) | (null) | (null) | 
+0

ありがとう!!!生徒の中には複数のスポーツ/アクティビティに登録されている学生もいます。このレポートは、当日の学生の出席のために各コーチに送付されます。 – Debora

+0

私はスポーツ/アクティビティコース名で結果をグループ化しようとしましたが、それにも成功しませんでした。私がGROUP BY COURSE NAMEを追加すると、エラーが発生します。ORA-00933:SQLコマンドが正しく終了していません – Debora

+0

Debora、見るべきデータがないときはとても助かりません。だから私は以前に何かデータを見ることができるかどうか尋ねた。どのテーブルがあなたに「出席者のコースへの参照」を提供していますか?それは 'pssis_attendance_meeting'にあります –

0

はあなたの忍耐をありがとう!以下の質問は、アクティビティ/スポーツに参加している学生の全期間の出席を引き出すために働いています。今は、1つ以上の期間に不在があったときだけ、レコードを表示しようとしています。私はattm.att_codeをNULLにするのを追加しようとしましたが、私はすべての期間にそうする方法を見つけることができませんでしたので、明らかに動作しませんでした。複数のスポーツ/アクティビティに登録されている学生の場合、複数の行を取得できますが、出席は両方の行で同じになります。

出席者をスポーツ/アクティビティ別にグループ化したいのですが、クエリ終了時にGROUP BY co.course_nameを追加すると、どちらも機能しません。

SELECT DISTINCT 
     s.student_number AS "Student Number", 
     s.lastfirst AS "Student Name", 
     DECODE(s.grade_level,-1,'PK',0,'KG',s.grade_level) AS "Grade", 
     s.home_phone AS "Phone", 
     DECODE(s.schoolid,280050,'Kodiak High School',s.schoolid) AS "School", 
     (SELECT DISTINCT co.course_name FROM ps.courses WHERE co.course_number=se.course_number AND se.course_number LIKE 'CLB%' OR se.course_number LIKE 'ACT%') AS "Course", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='1') AS "Per. 1", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='2') AS "Per. 2", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='3') AS "Per. 3", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='4') AS "Per. 4", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='5') AS "Per. 5", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='6') AS "Per. 6", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='7') AS "Per. 7", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='8') AS "Adv", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='9') AS "Act", 
     (SELECT listagg(attm.att_code,'|') within group (order by attm.att_code) FROM pssis_attendance_meeting attm WHERE attm.att_date=to_date(SYSDATE) AND attm.studentid=s.id AND attm.att_code IS NOT NULL AND attm.period_number='10') AS "Clb" 

     FROM attendance att 
     JOIN students s ON s.id=att.studentid 
     INNER JOIN cc ON s.ID=cc.studentid 
     INNER JOIN sections se ON cc.sectionid = se.id 
     JOIN courses co ON co.course_number=se.COURSE_NUMBER 

     WHERE att.att_date=to_date(SYSDATE) 
     AND att.schoolid in '280050' 
     AND s.enroll_status=0 
     AND cc.termid = 2700 
     AND se.course_number LIKE 'ACT%'OR se.course_number LIKE 'CLB%' 


     ORDER BY s.lastfirst 
+0

このサイトは "会話スレッド"ではありません....それは質問の回答サイトです。クエリを繰り返すことは有用ではありません。あなたがそれを実装すれば**はNOT NULLを解決するだけでなく、効率を改善するでしょう。あなたのためにすべてのことを書いていない(無給)と私は何を期待していますか? –

+0

私は理解しています!ご協力ありがとうございました!!!私はあなたの質問を取り入れようとします。 – Debora

0
SELECT 
     s.student_number AS "Student Number" 
     , s.lastfirst AS "Student Name" 
     , DECODE(s.grade_level, - 1, 'PK', 0, 'KG', s.grade_level) AS "Grade" 
     , s.home_phone AS "Phone" 
     , DECODE(s.schoolid, 280050, 'Kodiak High School', s.schoolid) AS "School" 
     , att.* 
FROM (
      SELECT 
        studentid 
        , max(case when period_number='1' then attcodes end) per1 
        , max(case when period_number='2' then attcodes end) per2 
        , max(case when period_number='3' then attcodes end) per3 
        , max(case when period_number='4' then attcodes end) per4 
        , max(case when period_number='5' then attcodes end) per5 
        , max(case when period_number='6' then attcodes end) per6 
        , max(case when period_number='7' then attcodes end) per7 
        , max(case when period_number='8' then attcodes end) per8 
        , max(case when period_number='9' then attcodes end) per9 
        , max(case when period_number='10' then attcodes end) per10 
      FROM (
        SELECT 
          attm.studentid 
         , attm.period_number 
         , listagg(attm.att_code,'|') within group (order by attm.att_code) attcodes 
        FROM pssis_attendance_meeting attm 
        WHERE attm.att_date=trunc(sysdate) 
        AND attm.att_code IS NOT NULL 
        AND attm.schoolid IN '280050' 
        GROUP BY 
          attm.studentid 
         , attm.period_number 
       ) d 
      GROUP BY 
        studentid 
    ) att 
INNER JOIN students s ON s.id = att.studentid 
INNER JOIN cc ON s.ID = cc.studentid 
INNER JOIN sections se ON cc.sectionid = se.id 
INNER JOIN courses co ON co.course_number = se.COURSE_NUMBER 
WHERE s.enroll_status = 0 AND cc.termid = 2700 AND se.course_number LIKE 'ACT%' OR se.course_number LIKE 'CLB%' 
ORDER BY s.lastfirst 
+0

最後に一言....返信する必要はありません –

関連する問題