2017-11-20 14 views
1

잘못된 출력 결과를 반환 목록을 저장할 특정 날짜PIVOT 기능은 내가라는 두 개의 테이블이

student_record_hist에 대한 클래스의 출석 항목을 저장합니다

class_record_hist 특정 클래스의 학생 출석. 여기에서 transaction_id가 두 테이블의 기본 키가됩니다.

내 데이터는 다음과 같습니다.

Working_date      STUDENT_NAME STUDENT_STATUS ATTENDANCE_CODE TEACHER_UPDATE TRANSACTION_ID 
-------------     ------------ -------------- --------------- -------------- -------------- 

2017-11-10 10:00:00    JAMES   ABSENT   2344    AB    23453 

2017-11-10 10:00:00    PETER   ABSENT   2344    AB    23453 

2017-11-10 10:00:00    MURPHY   PRESENT   1001    PR    23453 

2017-11-10 10:00:00    MICA   PRESENT   1001    PR    23453 

2017-11-10 10:00:00    STELLA   PRESENT   1001    PR    23453 

2017-11-10 10:00:00    STEPHEN  PRESENT   1001    PR    23453 

2017-11-10 10:00:00    TRACY   PRESENT   1001    PR    23453 

2017-11-10 14:00:00    JAMES   PRESENT   1001    PR    23454 

2017-11-10 14:00:00    PETER   PRESENT   1001    PR    23454 

2017-11-10 14:00:00    MURPHY   PRESENT   1001    PR    23454 

2017-11-10 14:00:00    MICA   PRESENT   1001    PR    23454 

2017-11-10 14:00:00    STELLA   PRESENT   1001    PR    23454 

2017-11-10 14:00:00    STEPHEN  PRESENT   1001    PR    23454 

2017-11-10 14:00:00    TRACY   ABSENT   2344    AB    23454 

2017-11-11 11:24:00    JAMES   PRESENT   1001    PR    23454 

2017-11-11 11:24:00    PETER   PRESENT   1001    PR    23454 

2017-11-11 11:24:00    MURPHY   PRESENT   1001    PR    23454 

2017-11-11 11:24:00    MICA   PRESENT   1001    PR    23454 

2017-11-11 11:24:00    STELLA   PRESENT   1001    PR    23454 

2017-11-11 11:24:00    STEPHEN  PRESENT   1001    PR    23454 

2017-11-11 11:24:00    TRACY   PRESENT   1001    PR    23454 

2017-11-11 14:24:00    JAMES   ABSENT   2344    AB    23454 

2017-11-11 14:24:00    PETER   ABSENT   2344    AB    23454 

2017-11-11 14:24:00    MURPHY   ABSENT   2344    AB    23454 

2017-11-11 14:24:00    MICA   ABSENT   2344    AB    23454 

2017-11-11 14:24:00    STELLA   ABSENT   2344    AB    23454 

2017-11-11 14:24:00    STEPHEN  PRESENT   1001    PR    23454 

2017-11-11 14:24:00    TRACY   PRESENT   1001    PR    23454 
나는이 기반으로하는 보고서를 생성합니다

가 기록

그리고 이것은

select * from 
( 
select student_name, student_status,attendance_code, 
working_date,class_id from 
( 
select to_char(a.date_tm,'yyyy-mm-dd hh24:mi:ss') AS working_date, 
b.student_name,b.student_status,b.attendance_code, 
b.teacher_update,a.transaction_id 
from class_record_hist a,student_record_hist b 
where a.school  = 'DON BOSCO' 
and a.building  = 'A1' 
and a.class_id = 'DB-3452' 
and a.date_tm >= to_date('2017-11-10 06:00:00','yyyy-mm-dd hh24:mi:ss') 
and a.date_tm <= to_date('2017-11-11 18:00:00','yyyy-mm-dd hh24:mi:ss') 
and a.transaction_id  = b.transaction_id 
order by working_date desc,b.student_name asc 
) 
) 
PIVOT 
( 
max(attendance_code) as code, 
max(student_status) as status 
for student_name in ('JAMES','PETER','MURPHY','MICA','STELLA','STEPHEN','TRACY'); 
) ; 

결과처럼 내 쿼리입니다 : 위의 결과에서

WORKING_DATE  CLASS_ID JAMES_STATUS JAMES_CODE PETER_STATUS PETER_CODE MURPHY_STATUS MURPHY_CODE MICA_STATUS MICA_CODE STELLA_STATUS STELLA_CODE STEPHEN_STATUS STEPHEN_CODE TRACY_STATUS TRACY_CODE 
------------  -------- ------------ ---------- ------------ ---------- ------------- ----------- ----------- --------- ------------- ----------- -------------- ------------ ------------ ---------- 


2017-11-10 10:00:00  DB-3452  PRESENT  2344   PRESENT 2344  PRESENT   1001  PRESENT  1001   PRESENT  1001   PRESENT  1001  PRESENT   1001 

2017-11-10 14:00:00  DB-3452  PRESENT  1001   PRESENT 1001  PRESENT   1001  PRESENT  1001   PRESENT  1001   PRESENT  1001  PRESENT   2344 

2017-11-11 11:24:00  DB-3452  PRESENT  1001   PRESENT 1001  PRESENT   1001  PRESENT  1001   PRESENT  1001   PRESENT  1001  PRESENT   1001 

2017-11-11 14:24:00  DB-3452  PRESENT  2344   PRESENT 2344  PRESENT   2344  PRESENT  2344   PRESENT  2344   PRESENT  1001  PRESENT   1001 

, 당신은 볼 수 있습니다 데이터가 잘못되었습니다.

제임스의 경우 코드 2344에서 볼 수있는 두 세션 동안 결석하지만 Status는 여전히 Present로 표시됩니다. 동일한 문제는 전체 레코드에서 발생합니다.

내가 뭘 잘못하고 있니?

제안 사항 & 입력 사항을 크게 평가 하시겠습니까?

답변

2

최소 (student_status)가 최대 총점 (attendance_code)

  • 결석 == 2,344
  • 현재 == 1,001

매우 피벗 따라서

select * 
from ( 
    select 
      student_name, student_status,attendance_code,working_date,class_id 
    from ( 
     your_current_query 
     ) d 
) d2 
    PIVOT ( 
     max(attendance_code) as code, 
     min(student_status) as status 
     for student_name in ('JAMES','PETER','MURPHY','MICA','STELLA','STEPHEN','TRACY') 
     ) 
; 
을 조정

SQL Fiddle

오라클 11g R2 스키마 설정 :

CREATE TABLE MY_RESULT 
    (WORKING_DATE timestamp, STUDENT_NAME varchar2(7), STUDENT_STATUS varchar2(7), ATTENDANCE_CODE int, TEACHER_UPDATE varchar2(2), TRANSACTION_ID int) 
; 

INSERT ALL 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'JAMES', 'ABSENT', 2344, 'AB', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'PETER', 'ABSENT', 2344, 'AB', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'MURPHY', 'PRESENT', 1001, 'PR', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'MICA', 'PRESENT', 1001, 'PR', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'STELLA', 'PRESENT', 1001, 'PR', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'STEPHEN', 'PRESENT', 1001, 'PR', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 10:00:00 AM', 'TRACY', 'PRESENT', 1001, 'PR', 23453) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'JAMES', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'PETER', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'MURPHY', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'MICA', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'STELLA', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'STEPHEN', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('10-Nov-2017 02:00:00 PM', 'TRACY', 'ABSENT', 2344, 'AB', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'JAMES', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'PETER', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'MURPHY', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'MICA', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'STELLA', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'STEPHEN', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 11:24:00 AM', 'TRACY', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'JAMES', 'ABSENT', 2344, 'AB', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'PETER', 'ABSENT', 2344, 'AB', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'MURPHY', 'ABSENT', 2344, 'AB', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'MICA', 'ABSENT', 2344, 'AB', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'STELLA', 'ABSENT', 2344, 'AB', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'STEPHEN', 'PRESENT', 1001, 'PR', 23454) 
    INTO MY_RESULT (WORKING_DATE, STUDENT_NAME, STUDENT_STATUS, ATTENDANCE_CODE, TEACHER_UPDATE, TRANSACTION_ID) 
     VALUES ('11-Nov-2017 02:24:00 PM', 'TRACY', 'PRESENT', 1001, 'PR', 23454) 
SELECT * FROM dual 
; 

검색어 1 :

select * 
from ( 
    select 
      student_name, student_status,attendance_code,working_date,class_id 
    from ( 
     select * from my_result 
     ) d 
) d2 
    PIVOT ( 
     max(attendance_code) as code, 
     min(student_status) as status 
     for student_name in ('JAMES','PETER','MURPHY','MICA','STELLA','STEPHEN','TRACY') 
     ) 

Results가 :

|   WORKING_DATE | 'JAMES'_CODE | 'JAMES'_STATUS | 'PETER'_CODE | 'PETER'_STATUS | 'MURPHY'_CODE | 'MURPHY'_STATUS | 'MICA'_CODE | 'MICA'_STATUS | 'STELLA'_CODE | 'STELLA'_STATUS | 'STEPHEN'_CODE | 'STEPHEN'_STATUS | 'TRACY'_CODE | 'TRACY'_STATUS | 
|-----------------------|--------------|----------------|--------------|----------------|---------------|-----------------|-------------|---------------|---------------|-----------------|----------------|------------------|--------------|----------------| 
| 2017-11-11 14:24:00.0 |   2344 |   ABSENT |   2344 |   ABSENT |   2344 |   ABSENT |  2344 |  ABSENT |   2344 |   ABSENT |   1001 |   PRESENT |   1001 |  PRESENT | 
| 2017-11-11 11:24:00.0 |   1001 |  PRESENT |   1001 |  PRESENT |   1001 |   PRESENT |  1001 |  PRESENT |   1001 |   PRESENT |   1001 |   PRESENT |   1001 |  PRESENT | 
| 2017-11-10 10:00:00.0 |   2344 |   ABSENT |   2344 |   ABSENT |   1001 |   PRESENT |  1001 |  PRESENT |   1001 |   PRESENT |   1001 |   PRESENT |   1001 |  PRESENT | 
| 2017-11-10 14:00:00.0 |   1001 |  PRESENT |   1001 |  PRESENT |   1001 |   PRESENT |  1001 |  PRESENT |   1001 |   PRESENT |   1001 |   PRESENT |   2344 |   ABSENT | 

25 년 전 ANSI 표준을 공식화 "명시 적" 조 문법적으로, 당신이이 변화로 승선 할 때가되었습니다. 예 :

 SELECT 
       to_char(c.date_tm, 'yyyy-mm-dd hh24:mi:ss') AS working_date 
      , s.student_name 
      , s.student_status 
      , s.attendance_code 
      , s.teacher_update 
      , c.transaction_id 
     FROM class_record_hist c 
     INNER JOIN student_record_hist s ON c.transaction_id = s.transaction_id 
     WHERE c.school = 'DON BOSCO' 
     AND c.building = 'A1' 
     AND c.class_id = 'DB-3452' 
     AND c.date_tm >= to_date('2017-11-10 06:00:00', 'yyyy-mm-dd hh24:mi:ss') 
     AND c.date_tm <= to_date('2017-11-11 18:00:00', 'yyyy-mm-dd hh24:mi:ss') 
     --ORDER BY 
      -- working_date DESC 
      --, s.student_name ASC 

당신은 subquery.I의 제안을

+0

덕분에 여전히 내 Pivot.But을 변경 한 결과가 잘못, 그것은 결석으로 표시됩니다되는 방식으로 그 하위 쿼리에 의해 주문을 필요가 없습니다 전체 레코드 집합에 대해 – jaggs

+1

두 테이블을 모두 제공하지 않아서 질문에 대한 작업이 수행되었습니다. 하나는 MAX()를 MIN()으로 변경하는 것입니다. 하위 쿼리에서 제안 된 변경 사항을 적용한 경우에는이를 취소하여 한 번에 하나의 변경 사항 만 처리하십시오. 위에서 볼 수 있듯이 나는 결석하거나 선물로 나가지 않고, 나는 둘 다 얻는다. –