백엔드/MySQL

ROLL UP 및 RANK

짱뚱짱 2024. 9. 2. 16:59

ROLL UP이나 RANK는 오라클에서도 쓰이고, 시험에도 많이 나오므로 중요하다.

📢ROLL UP

WITH ROLLUP : 그룹별로 합계를 한번에 구할 때 사용
GROUP BY 그룹명 WITH ROLLUP

📢ROLL UP 실습

--1. 과목별(co_name) 성적(중간, 기말, 출석, 과제) 합계  sum, group by
--과목		     중 기 출 과
--프로그래밍일반 	65 68 30 40
--디자인기초 	  50 50 10 10
--합계            00  00  00  00
--co_name => course c
--성적 => attend a

select ifnull(c.co_name, '합계') as '과목명',
sum(a.at_mid) as '중간', 
sum(a.at_final) as '기말',
sum(a.at_attend) as '출석',
sum(a.at_hw) as '과제'
from attend a
join course c 
on a.at_co_code = c.co_code
group by c.co_name WITH ROLLUP
order by GROUPING(c.co_name) ASC;

-- ifnull(값1, 값2) : 값1이 null이면 값2를 표시
-- if ( c.co_name is null, '합계', c.co_name)
-- ifnull(c.co_name, '합계')

+----------------+------+------+------+------+
| 과목명         | 중간 | 기말 | 출석 | 과제 |
+----------------+------+------+------+------+
| 기초전기       |   30 |   30 |    8 |    7 |
| 대학수학기초   |   70 |   78 |   18 |   19 |
| 디자인기초     |   39 |   39 |    9 |    8 |
| 색채이론       |   37 |   20 |    9 |    1 |
| 컴퓨터개론     |   46 |   43 |    9 |   14 |
| 프로그래밍일반 |   32 |   26 |    3 |    5 |
| 화학이론       |   54 |   50 |   13 |   13 |
| 합계           |  308 |  286 |   69 |   67 |
+----------------+------+------+------+------+

--2. 학점별 중간, 기말, 출석, 과제 평균 	avg, group by
select ifnull(a.at_score, '평균')as '학점',
round(avg(a.at_mid),2) as '중간', 
round(avg(a.at_final),2) as '기말',
round(avg(a.at_attend),2) as '출석',
round(avg(a.at_hw),2) as '과제'
from attend a
where a.at_score is not null
group by a.at_score WITH ROLLUP
--having a.at_score is not null
order by GROUPING(a.at_score);

--having a.at_score is not null
--with rollup은 having 조건을 인식못함.

+------+-------+-------+------+------+
| 학점 | 중간  | 기말  | 출석 | 과제 |
+------+-------+-------+------+------+
| A    | 39.50 | 39.50 | 9.50 | 9.00 |
| B    | 30.00 | 38.00 | 8.00 | 9.00 |
| C    | 30.00 | 30.00 | 8.00 | 7.00 |
| D    | 28.00 | 26.25 | 6.50 | 4.75 |
| F    | 19.00 | 11.33 | 2.67 | 4.67 |
| 평균 | 28.00 | 26.00 | 6.27 | 6.09 |
+------+-------+-------+------+------+

 

📢RANK

RANK는 SQL 시험에 굉장히 자주 나옴.

rank() over (order by 기준컬럼 desc) as 컬럼명

     👉 값이 같다면 같은 순위를 가짐 다음 순위는 건너 뜀

dense_rank() over (order by 기준컬럼 desc) as 컬럼명

     👉 값이 같다면 같은 순위를 가짐 다음 순위를 이어감

📢RANK 실습

--at_final을 기준으로 순위를 작성
--학번 at_final ranking

select at_std_num, at_final, 
rank() over (order by at_final desc) as ranking 
from attend 
where at_term = 1;

+------------+----------+---------+
| at_std_num | at_final | ranking |
+------------+----------+---------+
| 2020160002 |       40 |       1 |
| 2023160002 |       39 |       2 |
| 2020160001 |       38 |       3 |
| 2020123020 |       35 |       4 |
| 2019456001 |       30 |       5 |
| 2020123020 |       26 |       6 |
| 2020123001 |       24 |       7 |
| 2023160002 |       20 |       8 |
| 2019456001 |       15 |       9 |
| 2019160123 |       11 |      10 |
| 2020123001 |        8 |      11 |
+------------+----------+---------+

-- 기말 성적을 기준으로 5등 미만까지만 장학금대상 명단
select * from 
(select at_std_num, at_final, 
rank() over (order by at_final desc) as ranking 
from attend 
where at_term = 1) as r
where r.ranking < 5;

+------------+----------+---------+
| at_std_num | at_final | ranking |
+------------+----------+---------+
| 2020160002 |       40 |       1 |
| 2023160002 |       39 |       2 |
| 2020160001 |       38 |       3 |
| 2020123020 |       35 |       4 |
+------------+----------+---------+

'백엔드 > MySQL' 카테고리의 다른 글

MySQL 외래키(FK, foreign key) 연결 테이블 삭제 순서  (0) 2024.09.03
DB 관리 및 쿼리 실습(1)  (0) 2024.09.02
MySQL JOIN(2)  (0) 2024.09.02
MySQL JOIN(1)  (0) 2024.08.30
새로운 DB 생성 및 외래키 지정  (1) 2024.08.30