2014-05-09 4 views
1

나는 SQL을 배우고 있으며 사용자 지정 보고서를 만드는 데 문제가 있습니다. 나는 학교 출석 데이터를 가지고 일하고있다. 회원제 일과 각 부재 유형에 대한 일수를 알려주는 보고서를 만들고 싶습니다.SQL - 그룹으로 나누기로 나누기

이러한 보고서를 별도로 만들었습니다.

회원 일 (일 학교를 계산하여 계산 학생의 입국 날짜와 현재 날짜 사이의 세션에서였다. 회원 일 자체에 필드로 존재하지 않음)

SELECT sum(case when cd.DATE_VALUE >= s.ENTRYDATE and cd.DATE_VALUE <= current_timestamp THEN cd.INSESSION ELSE 0 END), s.LASTFIRST 
FROM CALENDAR_DAY cd,STUDENTS s 
WHERE cd.SCHOOLID = 405 
GROUP BY s.LASTFIRST 

카운트없는 유형에 따라

SELECT s.STUDENT_NUMBER, s.LASTFIRST,SUM(CASE WHEN a.ATTENDANCE_CODEID = 2 THEN 1 ELSE 0 END),SUM(CASE WHEN a.ATTENDANCE_CODEID = 4 THEN 1 ELSE 0 END),SUM(CASE WHEN a.ATTENDANCE_CODEID = 3 THEN 1 ELSE 0 END),SUM(CASE WHEN a.ATTENDANCE_CODEID = 51 THEN 1 ELSE 0 END) 
FROM ATTENDANCE a 
INNER join STUDENTS s 
ON a.STUDENTID = s.ID 
WHERE a.att_date between '%param1%' and '%param2%' 
GROUP BY s.STUDENT_NUMBER, s.LASTFIRST 

문제는 동일한 보고서에이를 넣으려고하면 학생과 출석으로 인해 출석 표에 학생이 표시되는 횟수가 회원 일수에 곱해진다는 것입니다. 솔루션에 대한 내 생각은 학생이 모든 라인에 기존의 학생 정보를 중화하기 위해 출석 테이블에 나타났다 횟수에 따라이 라인

sum(case when cd.DATE_VALUE >= s.ENTRYDATE and cd.DATE_VALUE <= current_timestamp THEN cd.INSESSION ELSE 0 END) 

를 나눌 수 있었다. 나는 그것을하는 방법을 이해할 수 없다. 이러한 유형의 문제에 대해서는 많이 알지 못하므로 잘 못된 트랙에서 벗어났습니다. 쉬운 해결책이 있습니다. 감사.

답변

0

문제는 일반적인 문제입니다. 하위 쿼리를 사용하지 않고 동시에 두 개의 차원을 요약하려고합니다. 두 개의 집계 하위 쿼리를 사용하여이 쿼리를 수행하려고합니다. 다음과 같은 내용 :

SELECT * 
FROM (SELECT sum(case when cd.DATE_VALUE >= s.ENTRYDATE and cd.DATE_VALUE <= current_timestamp 
        THEN cd.INSESSION 
        ELSE 0 
       END), s. STUDENT_NUMBER 
     FROM CALENDAR_DAY cd CROSS JOIN 
      STUDENTS s 
     WHERE cd.SCHOOLID = 405 
     GROUP BY s.STUDENT_NUMBER 
    ) sc JOIN 
    (SELECT s.STUDENT_NUMBER, s.LASTFIRST, 
      SUM(CASE WHEN a.ATTENDANCE_CODEID = 2 THEN 1 ELSE 0 END), 
      SUM(CASE WHEN a.ATTENDANCE_CODEID = 4 THEN 1 ELSE 0 END), 
      SUM(CASE WHEN a.ATTENDANCE_CODEID = 3 THEN 1 ELSE 0 END), 
      SUM(CASE WHEN a.ATTENDANCE_CODEID = 51 THEN 1 ELSE 0 END) 
     FROM ATTENDANCE a INNER join 
      STUDENTS s 
      ON a.STUDENTID = s.ID 
     WHERE a.att_date between '%param1%' and '%param2%' 
     GROUP BY s.STUDENT_NUMBER, s.LASTFIRST 
    ) sa 
    on sc.STUDENT_NUMBER = sa.STUDENT_NUMBER; 
+0

완벽합니다. 도와 줘서 고마워! –