- 9주차 과제 - 그룹 함수, 윈도우 함수
- 실습 환경 : Oracle
-
해결 날짜 : 2021-05-01
-
과제
-
9-1. [예제12]를 참고하여 PLAYER 테이블에서 팀ID 별, 포지션 별 선수들 수의 합계를 구하는 SQL문을 작성하고 그 결과를 출력하라. (단, 포지션이 NULL인 데이터는 제외하고 팀ID 순으로 정렬한다.) [1점]
- SQL문 :
SELECT DECODE(GROUPING(TEAM_ID),1,'All Team', TEAM_ID) AS "팀 아이디", DECODE(GROUPING(POSITION),1,'All Position', POSITION) AS "포지션", COUNT(*) "선수 수 총합" FROM PLAYER WHERE POSITION IS NOT NULL GROUP BY GROUPING SETS (TEAM_ID, POSITION) ORDER BY TEAM_ID;
- 실행 결과 :
-
9-2. [예제9]를 참고하여 PLAYER 테이블에서 CUBE 함수를 이용하는 한글 질의문과 SQL문을 작성하고 그 결과를 출력하라. [2점]
-
한글 질의문 : PLAYER 테이블에서 팀ID 별, 포지션 별 선수들 수의 합을 구하여 출력하여라. (단, CUBE 함수를 사용하시오)
-
SQL문 :
SELECT CASE GROUPING(TEAM_ID) WHEN 1 THEN 'ALL Team' ELSE TEAM_ID END AS "팀 아이디", CASE GROUPING(POSITION) WHEN 1 THEN 'ALL POSITION' ELSE POSITION END AS "포지션", COUNT(*) "선수 수 총합" FROM PLAYER WHERE POSITION IS NOT NULL GROUP BY CUBE (TEAM_ID, POSITION);
- 실행 결과 :
-
-
9-3. [예제1], [예제2]를 참고하여 PLAYER 테이블에서 팀ID, 소속선수 수, 소속 선수 수가 많은 순으로 팀 순위를 구하는 SQL문을 작성하고 그 결과를 출력하라. (단, 하나의 SQL문으로 작성되어야 하며, 팀 순위는 동일한 값에 대해서 동일한 순서를 부여하는 것과 동일한 순위를 하나의 건수로 취급하는 것 두 가지 방법을 모두 사용하여 출력한다.) [1점] (하나의 쿼리에 짜야함)
- SQL문 :
SELECT TEAM_ID "소속팀 ID", COUNT(TEAM_ID) "소속 선수 수", RANK() OVER (ORDER BY COUNT(TEAM_ID) DESC) ALL_RANK, DENSE_RANK() OVER (ORDER BY COUNT(TEAM_ID) DESC) DENSE_RANK FROM PLAYER GROUP BY TEAM_ID;
- 실행 결과 :
-
9-4. [예제4-1], [예제5]를 참고하여 PLAYER 테이블에서 선수들의 소속팀ID, 선수이름, 선수의 키, 소속팀 선수들 중 최장신 선수의 키, 최단신 선수의 키를 출력하는 SQL문을 작성하고 그 결과를 출력하라. [1점]
- SQL문 :
SELECT TEAM_ID "소속팀 ID", PLAYER_NAME "선수명", HEIGHT "선수 키", MAX(HEIGHT) OVER (PARTITION BY TEAM_ID) AS "소속팀의 최장신", MIN(HEIGHT) OVER (PARTITION BY TEAM_ID) AS "소속팀의 최단신" FROM PLAYER;
- 실행 결과 :
-
9-5. [예제7]을 참고하여 PLAYER 테이블에서 같은 연도에 입단한 선수들의 평균 몸무게를 출력하는 SQL문을 작성하고 그 결과를 출력하라. (단, 평균 몸무게는 소수점 첫째자리까지 표시한다.) [1점]
- SQL문 :
SELECT PLAYER_ID "선수 ID", PLAYER_NAME "선수명", JOIN_YYYY "입단년도", WEIGHT "몸무게", ROUND(AVG(WEIGHT) OVER (PARTITION BY JOIN_YYYY ORDER BY JOIN_YYYY), 1) AS "해당 선수와 입단년도가 같은 선수들의 평균 몸무게" FROM PLAYER WHERE JOIN_YYYY IS NOT NULL AND WEIGHT IS NOT NULL;
- 실행 결과 :
-
9-6. [예제9], [예제10]을 참고하여 PLAYER 테이블에서 포지션 별로 선수들의 입단연도가 빠른 순으로 포지션명, 선수이름, 입단연도, 포지션 내에서 가장 입단연도가 빠른 선수와 가장 늦은 선수이름을 출력하는 SQL문을 작성하고 그 결과를 출력하라. (단, 입단연도가 같으면 이름 순으로 정렬한다.) 2점
- SQL문 :
SELECT POSITION "포지션", PLAYER_NAME "선수명", JOIN_YYYY "입단년도", FIRST_VALUE(PLAYER_NAME) OVER (PARTITION BY POSITION ORDER BY JOIN_YYYY, PLAYER_NAME ROWS UNBOUNDED PRECEDING) AS "포지션 내에서 입단년도가 가장 빠른 선수", LAST_VALUE(PLAYER_NAME) OVER (PARTITION BY POSITION ORDER BY JOIN_YYYY, PLAYER_NAME ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS "포지션 내에서 입단년도가 가장 느린 선수" FROM PLAYER WHERE JOIN_YYYY IS NOT NULL;
- 실행 결과 :
-
9-7. [예제17]을 참고하여 PLAYER 테이블에서 NTILE 함수를 이용하는 한글 질의문과 SQL문을 작성하고 그 결과를 출력하라. [2점]
-
한글 질의문 : PLAYER 테이블에서 선수들을 포지션 별로 키가 큰 순으로 정렬하고, 포지션 별로 키를 기준으로 5개의 그룹으로 분류하여라.
-
SQL문 :
SELECT POSITION 포지션, PLAYER_NAME 선수명, HEIGHT "선수 키", NTILE(5) OVER (PARTITION BY POSITION ORDER BY HEIGHT DESC) AS "포지션 별 키 그룹" FROM PLAYER WHERE HEIGHT IS NOT NULL;
- 실행 결과 :
-
-