2014-05-22 4 views
0

최대 총 크레딧 포인트로 등록한 학생을 나열하는 쿼리를 작성하려고합니다.합계 쿼리 최대 값

SELECT s.S_ID, 
     s.S_LAST, 
     s.S_FIRST, 
     s."Total Credits" 
FROM 
    (SELECT q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST, 
      sum(q1.CREDITS) "Total Credits" 
    FROM 
    (SELECT COURSE_NO, 
      CREDITS 
     FROM COURSE) q1 
    JOIN 
    (SELECT s.S_ID, 
      s.S_LAST, 
      s.S_FIRST, 
      cs.COURSE_NO 
     FROM STUDENT s 
     JOIN ENROLLMENT e ON s.S_ID = e.S_ID 
     JOIN COURSE_SECTION cs ON e.C_SEC_ID = cs.C_SEC_ID) q2 ON q1.COURSE_NO = q2.COURSE_NO 
    GROUP BY q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST) q3 
GROUP BY s.S_ID, 
     s.S_LAST, 
     s.S_FIRST, 
     s."Total Credits" 
WHERE "Total Credits" = max("Total Credits"); 

이 내가이 오류를 얻고 작동하지 않습니다 :

ORA-00933: SQL command not properly ended 
00933. 00000 - "SQL command not properly ended" 
*Cause: 
*Action: 
Error at Line: 23 Column: 1 

어떤 도움을 이해할 수있을 것이다

여기 내 쿼리입니다.

+0

당신의 외부 선택은 s''에서하지 q3''에서이고 절은 잘못 where' 마지막'당신이 사용하는 –

+0

하는 데이터베이스? 그리고 가장 많은 학점을 가진 모든 학생들을 원하십니까? – Bohemian

+0

이것은 Oracle SQL Developer를 사용하고 있습니다. 예, 저는 한 학점 만이 아니라 가장 많은 학점을 가진 모든 학생들을 원합니다. – user3664923

답변

0
SELECT q3.S_ID, 
     q3.S_LAST, 
     q3.S_FIRST, 
     max(q3.Total Credits) 
FROM 
    (SELECT q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST, 
      sum(q1.CREDITS) Total Credits 
    FROM 
    (SELECT COURSE_NO, 
      CREDITS 
     FROM COURSE) q1 
    JOIN 
    (SELECT s.S_ID, 
      s.S_LAST, 
      s.S_FIRST, 
      cs.COURSE_NO 
     FROM STUDENT s 
     JOIN ENROLLMENT e ON s.S_ID = e.S_ID 
     JOIN COURSE_SECTION cs ON e.C_SEC_ID = cs.C_SEC_ID) q2 ON q1.COURSE_NO = q2.COURSE_NO 
    GROUP BY q2.S_ID, 
      q2.S_LAST, 
      q2.S_FIRST) q3 
GROUP BY q3.S_ID, 
     q3.S_LAST, 
     q3.S_FIRST; 
+0

여전히 올바르지 않습니다. –

+0

예, 작동하지 않습니다. 죄송합니다. – user3664923

+0

내가이 작업을 어떻게 수행 할 수 있는지에 대한 다른 제안이 있으십니까? – user3664923

0

당신은 당신의 희망을 단지 및 합계()에 의해 그룹을 사용하여이 문제를 해결하고, 얼마나 많은 학생들 제한 1 이상 따라와 합()에 의해 순서로 결과를 검색 할 수 있습니다.

이렇게하면 외부 하위 쿼리가 제거됩니다.

0

동일한 질문에 대한 두 번 불법 게시! 이것은 내가 당신의 다른 게시물에 준 대답입니다. 똑같은 일이 여전히 여기에 적용됩니다.

나는 당신의 별명이 문제입니다 (더 오라클 시스템이 테스트 없음) 확신 :

sum(q1.CREDITS) Total Credits 

sum(q1.CREDITS) "Total Credits" 

그러므로

max(q3.Total Credits) 

수 있어야 정상적으로 be

max(q3."Total Credits") 

별칭의 공백을 제거 할 수 있습니다. 하지만 그보다 더 많은 것이있을 수 있습니다. 제가 말했듯이, 나는 이것을 테스트 할 수있는 Oracle 머신이 없습니다. 모든 "노이즈"쿼리가 그건, 그것은 s 당신이 집계와 세부 사항을 직면하고있는 WHERE 상태 또한, 메인 쿼리에서 보이지 않는 것을 쉽게 알 수

SELECT s.S_ID, s.S_LAST, s.S_FIRST, s."Total Credits" 
FROM 
    (SELECT ... 
    FROM (...) q1 
    JOIN (...) q2 
) q3 
GROUP BY s.S_ID, s.S_LAST, s.S_FIRST, s."Total Credits" 
WHERE "Total Credits" = max("Total Credits"); 

될 제거

0

불가능 (적어도 그 방법은 없음)

0

쿼리를 한 번에 하나씩 만들면 먼저 해당 인라인 뷰가 필요 없음을 알게됩니다. 하나의 CTE 정의와 하위 쿼리로 매우 간단하게 수행 할 수 있습니다.

WITH 
student AS 
(SELECT 1 s_id, 'Jones' s_last, 'Sally' s_first FROM dual UNION ALL 
    SELECT 2, 'Smith', 'Pete' FROM dual UNION ALL 
    SELECT 3, 'DeThroned', 'Kate' FROM dual 
), 
enrollment AS 
(SELECT 1 s_id, 10 c_sec_id FROM dual UNION ALL 
    select 1, 11 FROM dual UNION ALL 
    select 2, 11 FROM dual UNION ALL 
    SELECT 3, 12 FROM dual 
), 
course_section AS 
(SELECT 10 c_sec_id, 101 course_no FROM dual UNION ALL 
    SELECT 11, 102 FROM dual UNION ALL 
    SELECT 12, 103 FROM dual 
), 
course AS 
(SELECT 101 course_id, 1 credits FROM dual UNION ALL 
    SELECT 102, 2 FROM dual UNION ALL 
    SELECT 103, 3 FROM dual 
), 
StudentCredit AS 
(SELECT s.s_id, s_last, s_first, sum(c.credits) AS TotalCredits 
    FROM student s 
    JOIN enrollment e 
    ON e.s_id = s.s_id 
    JOIN course_section cs 
    ON cs.c_sec_id = e.c_sec_id 
    JOIN course c 
    ON c.course_id = cs.course_no 
    GROUP BY s.s_id, s_last, s_first 
) 
SELECT * 
FROM StudentCredit 
WHERE TotalCredits = (
      SELECT MAX(TotalCredits) 
      FROM StudentCredit 
     );