2010-05-15 3 views
4

제목이 충분히 설명하기를 바랍니다.이름 목록을 얻는 방법 + 다른 테이블의 이름과 관련된 항목 수

기본적으로 학생용 테이블과 부재 중 테이블이 있습니다. 학생 테이블에는 학생 정보 (이름, DOB, 학생 ID 등)가 있으며 부재 테이블에는 부재 (날짜, 이유, 학생 ID와 관련된)가 포함됩니다. 나는 학생들의 전체 목록과 그들의 결석을 얻고 싶다.

샘플 결과는 다음과 같습니다

 
StudentName Absences 
------------- ----------- 
Johnny   3 
Mark   2 
James   1 
Anthony  0 
Sharon   0 

누군가가 내가이 문제를 해결해야하는 방법을 제안 할 수 있습니다?

나는 가능성 등

감사합니다,

야곱을 몇 가지 견해를 통합, 단일 SQL 문이하는 것을 선호합니다.

답변

12

이것은 각 학생의 결석 횟수를 찾고, 예제 에서처럼 대부분의 결석으로 정렬합니다.

SELECT 
    studentname, count(absences_id) 
FROM 
    Students s 
LEFT OUTER JOIN 
    Absences a ON s.student_id=a.student_id 
GROUP BY studentname 
ORDER BY count(absences_id) DESC, student_name 

LEFT OUTER JOIN은 일부 학생의 결석 테이블에 행이 없기 때문에 중요합니다. 이 경우 해당 행의 부재로 인한 모든 필드는 널 (NULL)이되며, 널 (null)이 아닌 필드 만 계산하므로 계수는 0이됩니다.

각 부재가 일정 범위의 날짜 (예 : (예 : 종료일, 종료일, 종료일)을 SUM (DATEEDIFF (일, 시작일, 종료일))로 바꿉니다.

SELECT 
    studentname, SUM(ISNULL(DATEDIFF(day, start_date, end_date),0) 
FROM 
    Students s 
LEFT OUTER JOIN 
    Absences a ON s.student_id=a.student_id 
GROUP BY studentname 

당신은 (...) 합계에 ORDER BY 절을 설정할 수 있지만 다른 쿼리에서 그것을 포장 가독성과 유지 보수성이 향상됩니다.

+0

감사합니다 ...이 쿼리로 끝까지 관리했습니다. 랜디의 대답에서 일한 후 나 자신. 도움과 설명에 감사드립니다. 나는 GROUP BY 절을 사용한 적이 없다 ... SQL BOL을 살펴 봐야 할 것 같다. 다시 한번 감사드립니다. –

0
select studentname, count(absences) 
from student s, absence a 
where s.student_id (+) = a.student_id 
group by studentname 
+1

에 결석 참여 학생들의 0과 그렇지 않은 학생들을 StudentName로 s.StudentName을 선택 결석은 표시되지 않습니다. – Artefacto

+0

-1 그게 정말로? 어쨌든 숙제처럼 보입니다. – Randy

+0

'(+)'는 Oracle LEFT JOIN 구문입니다. ANSI-92 LEFT JOIN 구문을 사용합니다. TSQL은 SQL Server 또는 Sybase를 의미합니다 ... –

0

계산 (A. *) 결석으로부터 내부 이 s.StudentID = a.StudentID

가입 당신이 왼쪽을 사용해야합니다
관련 문제