안녕하세요 select student_name from(select s.student_id, s.student_name, s.dept_name, sum(credit) as sum_cre from student s, course c, takes t where s.student_id = t.student_id and c.course_id = t.course_id group by s.student_name) hi where sum_cre > (select avg(sum_cre) from (select s.student_id, s.student_name, s.dept_name, sum(credit) as sum_cre from student s, course c, takes t where s.student_id = t.student_id and c.course_id = t.course_id group by s.student_name) hello) ;
이렇게 하면 되는데
select student_name from(select s.student_id, s.student_name, s.dept_name, sum(credit) as sum_cre from student s, course c, takes t where s.student_id = t.student_id and c.course_id = t.course_id group by s.student_name) hi where sum_cre > (select avg(sum_cre) from hi ) ;
이렇게 하면 hi테이블이 없다고 나옵니다.
1. 서브쿼리를 테이블 처럼 다시 사용하려면?
- WITH 구문을 사용하면 됩니다.
- 다만 꼭 동일 서브쿼리를 두번 사용해야 하는가? 생각해볼 필요가 있습니다.
2. 그룹바이 구문도 표준에 어긋나는 구문이네요. MySQL 에서만 에러 안나는 구문.
- SELECT 에서 다른 항목들을 지우던가
- GROUP BY 에서 다른 항목들을 추가하던가 해야 맞습니다.
3. credit 이 어느 테이블의 항목인지 표시가 안되어 있네요.
- 어느 테이블의 항목인지에 따라서 조인 테이블이 필요 없을 수도 있습니다.
WITH hi AS ( SELECT s.student_id , s.student_name , s.dept_name , SUM(credit) AS sum_cre FROM student s , course c , takes t WHERE s.student_id = t.student_id AND c.course_id = t.course_id GROUP BY s.student_id, s.student_name, s.dept_name ) SELECT student_name FROM hi WHERE sum_cre > (SELECT AVG(sum_cre) FROM hi) ; SELECT * FROM (SELECT s.student_id , s.student_name , s.dept_name , SUM(credit) AS sum_cre , AVG(SUM(credit)) OVER() AS avg_sum_cre FROM student s , course c , takes t WHERE s.student_id = t.student_id AND c.course_id = t.course_id GROUP BY s.student_id, s.student_name, s.dept_name ) hi WHERE sum_cre > avg_sum_cre ;