2017-04-26 6 views
1

질문! 나는 모든 책과 책 제목, 평균 비용 및 정규 비용을 나열하려고 노력하고 있습니다.특정 그룹의 AVG를 찾기 위해 상관 하위 쿼리

지금까지 내 쿼리는

SELECT BOOK_SUBJECT, AVG(BOOK_COST) 
FROM BOOK 
GROUP BY BOOK_SUBJECT 

이 쿼리 나에게 네 그룹 총 비용의 평균을 제공합니다 ...입니다. Final out put should look like thisBOOK_NUM, BOOK_TITLE, BOOK_SUBJECT, BOOK_COST을 가져올 필요가 있습니다. 알아낼 수 없습니다. 누군가 도울 수 있습니까? 상관 하위 쿼리?

SELECT BOOK_NUM AS Number, 
     BOOK_TITLE AS Title, 
     BOOK.BOOK_SUBJECT AS Subject, 
     BOOK_COST AS Cost, 
     AVG_BOOK_COST AS 'Avg Cost' 
FROM BOOK 
JOIN (SELECT BOOK_SUBJECT AS BOOK_SUBJECT, 
       AVG(BOOK_COST) AS AVG_BOOK_COST 
     FROM BOOK 
     GROUP BY BOOK_SUBJECT 
    ) AS SUBJECT_AVG_FINDER ON BOOK.BOOK_SUBJECT = SUBJECT_AVG_FINDER.BOOK_SUBJECT 
ORDER BY BOOK_NUM; 

우리가 BOOK_SUBJECT에 의해 그룹에 BOOK의 내용을 각 과목의 평균을 계산하려면 ...

SELECT BOOK.BOOK_NUM, BOOK.BOOK_TITLE, BOOK.BOOK_SUBJECT, BOOK.BOOK_COST, T.AVG_COST 
FROM BOOK 
INNER JOIN (
    SELECT BOOK_SUBJECT, AVG(BOOK_COST) AVG_COST 
    FROM BOOK 
    GROUP BY BOOK_SUBJECT 
) T ON BOOK.BOOK_SUBJECT = T.BOOK_SUBJECT 
+0

당신은 SQL-서버, MySQL은, 또는 뭔가를 사용하고 있습니까? 사용중인 태그는 추가하고 다른 태그는 추가하지 마십시오. – toonice

+0

또한 책 테이블 (및 테이블 테이블에 조인 할 테이블)의 전체 구조도 포함시켜야합니다. 그렇지 않으면 순수한 추측이 될 것입니다. – StevieG

답변

0

다음 시도하십시오 :

0

이 작업을 수행하는 하위 쿼리를 사용하여 AVG(BOOK_COST)을 사용하여 각 그룹의 평균 평균을 찾으십시오. 그러나 다른 필드를 BOOK으로 그룹화하는 대신, 도서의 각 레코드의 지정된 필드에 BOOK_SUBJECT의 평균 비용이 끝에 표시되도록 표시하는 것을 피하십시오. 이는 INNER JOIN (BOOK)과 각 주제에 대한 평균 평균 비용을 찾는 데 사용되는 하위 쿼리를 제안합니다.

나는
SELECT BOOK_SUBJECT AS BOOK_SUBJECT, 
     AVG(BOOK_COST) AS AVG_BOOK_COST 
FROM BOOK 
GROUP BY BOOK_SUBJECT 

우리는 GROUP BY 절을 필요로 부분적으로 있기 때문에 BOOK_SUBJECT을 선택해야하고 우리가 필요합니다 부분적으로 있기 때문에 ... BOOK에 나열된 각 주제에 대한 평균 평균 비용을 찾으려면 다음 코드를 사용 이 하위 쿼리에서 생성 된 테이블을 그룹화되지 않은 목록 BOOK에 가입시킵니다.

AVG(BOOK_COST)의 별명은 AVG_BOOK_COST이라는 별명으로 생성 된 필드를 훨씬 쉽게 나타냅니다.

JOIN이라는 단어 앞에 조인 유형이없는 경우 대부분 INNER JOIN을 사용할 수 있지만 대부분의 경우 SQL을 INNER JOIN으로 가정하고 일부는 그렇게해야합니다. 기본적으로 I와 다른 많은 사람들은 단순히 JOIN을 사용합니다. (가) 떠나, (내가 SUBJECT_AVG_FINDER의 별칭을 준하는) 우리의 하위 쿼리에서 기록을 해당 년대의 사본을해야합니다 BOOK에서에서 각 레코드를 수행 가입하면

두 개의 필드와 각 레코드는 BOOK_SUBJECT을했다. SQL 버전을 혼동하지 않도록 테이블/하위 쿼리를 중복이 발생하는 필드 이름과 함께 지정해야합니다. 따라서 전체 구문의 세 번째 줄에 BOOK.BOOK_SUBJECT을 입력해야합니다.

각 필드에 원하는 최종 출력 이미지 별칭이 지정되었습니다.

행 번호 필드를 복제 할 필요가 없다고 가정했습니다. 이것이 틀리면 달리 명시하십시오.

마지막으로, ORDER BY BOOK_NUM 줄을 추가하여 원하는 결과에 따라 결과를 정렬했습니다.

팁으로서, 허용 되더라도 외침 (예 :전체 대문자) 귀하의 필드 이름, 테이블 이름 및 별칭 '(그렇게 할 필요가 없다면), 그래도 SQL 물건을 외쳐야 (SELECT, FROM, AS 등). 이렇게하면 각 단어를 어떻게 사용하는지에 대한 시각적 단서를 제공함으로써 문장을 읽고 디버그하기가 더 쉬워집니다. 난 당신이 질문이나 의견이 있으면, 그에 따라 코멘트를 게시 주시기 바랍니다

SELECT book_num AS Number, 
     book_title AS Title, 
     book.book_subject AS Subject, 
     book_cost AS Cost, 
     avg_book_cost AS 'Avg Cost' 
FROM book 
JOIN (SELECT book_subject AS book_subject, 
       AVG(book_cost) AS avg_book_cost 
     FROM book 
     GROUP BY book_subject 
    ) AS subject_avg_finder ON book.book_subject = subject_avg_finder.book_subject 
ORDER BY book_num; 

대신에 우리의 SQL 문을 제시하는 다음과 같은 방법을 ... 제안한다.

0

사용이 코드

SELECT BOOK_NUM, BOOK_TITLE, BOOK_SUBJECT, BOOK_COST, 
AVG(BOOK_COST) OVER(PARTITION BY BOOK_SUBJECT) AS AVG_COST 
FROM BOOK