2017-11-13 6 views
1

MoviesReviews의 두 테이블이 있습니다.평균 등급과 이름으로 상위 레코드를 추출하는 쿼리

Movies에는 ID, Title, Genre, Duration;

Reviews에는 ID, 설명, Movie_ID (영화의 ID 참조) 및 등급이 있습니다.

평균으로 영화의 상단을 표시하고 싶습니다. (영화의 제목과 평균 등급을 표시하고 싶습니다.)

2 개의 하위 쿼리로 시도해 보았습니다. 하나는 제목을 선택하는 것이고 다른 하나는 리뷰에서 AVG를 가져 오는 것입니다 (동영상으로 결합 됨). SELECT TITLE FROM MOVIES ...SELECT AVG(GRADE)...의 결과를 입력하는 방법을 알 수 없습니다. 올바른 방법을 시도하고 있습니까?

Movies 

ID  TITLE   GENRE  DURATION 
1   Movie_name_1 Sci-fi  120 
2   Movie_name_2 Comedy  100 
3   Movie_name_3 Drama  140 
4   Movie_name_4 Sci-fi  105 

Reviews 
ID  Description Movie_id  Grade 
1   WOW    1    10 
2   SUCH   2    9 
3   Great   3    9 
4   Amazing   2    10 
5   Decent   4    7 
6   Legendary  2    10 
7   Waste   3    4 
8   hmmm   1    6 

예상 결과 :

SELECT Title, AVG(Grade) Grade 
FROM Movies M 
JOIN Reviews R on R.Movie_ID = M.ID 
GROUP BY Title 
ORDER BY Grade DESC 
FETCH FIRST 5 ROWS ONLY; 

편집 : 아래에 더 자세한 설명을

이 작동합니다
Movie_name_1   9.50 
Movie_name_2   9.25 
Movie_name_3   8.25 
Movie_name_4   7 
+0

[DBMS] (HTTPS : //en.wikipedia. org/wiki/DBMS) 제품을 사용하고 있습니까? 포스트그레스? 신탁? "_SQL_"은 쿼리 언어 일뿐 특정 데이터베이스 제품의 이름은 아닙니다. –

+0

** 귀하의 질문에 ** [편집] **하고 [샘플 데이터] (http://plaintexttools.github.io/plain-text-table/) 및 그 데이터를 기반으로 예상되는 출력을 추가하십시오. [** 포맷 된 텍스트 **] (http://stackoverflow.com/help/formatting)하시기 바랍니다. [** 스크린 샷 없음 **] (http://meta.stackoverflow.com/questions/285551/why-may -i-not-upload-images-of-code-on-so-ask-a-question/285557 # 285557). ** [편집] ** 귀하의 질문 - 코멘트 **에 ** 코드 ** 또는 추가 정보를 게시하지 마십시오. –

+0

이것은 단순한'INNER JOIN','group by' 및'avg()'aggregate 인 것처럼 보입니다. 시도한 것은 무엇이고 작동하지 않는 것은 무엇입니까? 아니요 두 가지 검색어가 없습니다. 이제 예상 결과가 movie_name_1에 대한 10 + 6 = 16/2 = 8의 데이터와 어떻게 일치하는지 보지 못했지만 9.5가 있습니다. – xQbert

답변

2

, 당신이보고 싶은 그러나 많은 행 FETCH 번호를 변경

기준 이 쿼리의 내용은 다음과 같습니다.

이렇게하면 단일 결과 집합에 필요한 모든 정보를 얻을 수 있습니다.

SELECT Title, AVG(Grade) Grade 
FROM Movies M 
JOIN Reviews R on R.Movie_ID = M.ID 
GROUP BY Title 
:

다음, 당신은 (당신이 결국 제목 당 평균 등급을 원하기 때문에)이 Title하여 평균화 기능 AVG() 및 그룹화를 사용하여 수행됩니다 Title

영화 당 평균 Grade합니다

참고 : 두 번째 GradeAVG(Grade) Grade에 불과합니다. AVG(Grade)에는 열 이름이 없으므로 단순화를 위해 새 평균 열 Grade을 호출합니다.

AVG(Grade) as Grade으로 작성하여 더 명확하게 지정할 수도 있습니다.

다음으로 가장 인기있는 영화를 가장 먼저보고 싶습니다. ORDER BY으로이 작업을 수행합니다. 우리는 여기에 우리의 평균 Grade 열을 참조 할 수 있습니다 :

SELECT Title, AVG(Grade) Grade 
FROM Movies M 
JOIN Reviews R on R.Movie_ID = M.ID 
GROUP BY Title 
ORDER BY Grade DESC --Referencing the averaged column, not the main column 

마지막으로, 당신은 당신이 최고 N 행을보고 싶어 언급했다.

SELECT Title, AVG(Grade) Grade 
FROM Movies M 
JOIN Reviews R on R.Movie_ID = M.ID 
GROUP BY Title 
ORDER BY Grade DESC 
FETCH FIRST 5 ROWS ONLY; 

을 그리고 여기에 추가 명확성을 위해 다른 별명 이름으로 마지막 버전입니다 : 우리는 FETCH FIRST n ROWS ONLY 절을 사용하여이 작업을 수행 할 수 있습니다

SELECT Title, AVG(Grade) Averaged_Grade 
FROM Movies M 
JOIN Reviews R on R.Movie_ID = M.ID 
GROUP BY Title 
ORDER BY Averaged_Grade DESC 
FETCH FIRST 5 ROWS ONLY; 
+0

감사합니다! 이게 내 문제를 해결했습니다! AVG (Grade) Grade 구문이 어떻게 작동하는지 설명해 주시겠습니까? 이 쿼리와 관련하여 혼란 스러웠다. 영화에서 타이틀을 선택하고 동일한 Select 문에서 리뷰의 평균 성적을 선택할 수 있다는 것을 알지 못했다. 2 개의 선택에서 분리하려고했다. – Daniel

+0

@Daniel 확실한 것. 내가 설명을 편집하자, 입력 할 수있는 공간이 더 넓어 질 것이다 –

+0

@ 대니얼 편집을 보면 필요한 것 이상일 수 있지만이 방법으로는 분명해야한다. 각 쿼리를 실행하면 도움이 될 수도 있습니다. –