요새 롯데 자이언츠의 상승세가 무섭습니다. 이번 년도에 가을야구 갈 거 같습니다. 초반부터 야구 이야기를 해서 죄송합니다. group by에서 2개 이상의 속성으로 그룹화를 하고 싶을 때 어떻게 해야 좋을까요? 오늘 그것을 배워보고 응용 문제를 하나 풀어보겠습니다.
쿼리부터 알아보겠습니다.
group by 절에 속성(1)부터 속성(n)까지 좌르륵 넣어줍니다. 이는 나누는 기준이 속성(1),...,속성(n)임을 의미합니다. 예를 들어서, 나누는 기준이 년, 분기였다면, 2015년 1분기, 2015년 2분기, 2015년 3분기, 2015년 4분기, ... 등으로 그룹화가 된다는 것입니다. 그리고, 노란색에 나타난 attribute는 select 절에 똑같이 나타나야 합니다.
이것만 보시면 이해가 안 되실 듯 싶으니, 쉬운 예를 먼저 들어보겠습니다. test 테이블을 보겠습니다. 그리고, name은 오름차순으로, _check는 내림차순으로 정렬하겠습니다.
대충 이렇게 쿼리를 작성하면 되겠군요.
test 테이블을 보시면, name이 A인 것에는 Y가 1개 있습니다. B는 Y가 1개, N이 1개, C는 Y가 2개, N이 1개, cho는 N이 1개, D는 N이 1개, E는 Y가 1개 N이 2개, F는 Y가 1개 N이 1개, maltize는 Y가 3개 N이 1개 있음을 알 수 있습니다.
속성 2개 이상을 어떻게 group by를 시킬까요? 그룹 바이 절에 속성 2개 이상을 명시하면 됩니다. 그리고, 이 절에 나타난 속성들을 모두 select 절에 나타나야 합니다. 저는 name과 _check를 그룹을 짓기 위한 속성으로 썼기 때문에, name과 _check를 select 절에 썼습니다.
그러면, 의도에 맞게 name, _check로 groupping 된 것에, count(*)을 적용한 결과가 생성되게 됩니다. 이 함수는 결과 레코드의 수를 세는 함수인데요. 조건에 맞게 나눠 놓은 버킷에, 데이터가 몇 개 들어갔는지를 리턴해 줍니다.
학교 데이터 베이스의 teaches 테이블에서, yy학년도 ss학기에 가장 많은 수업을 강의한 교수를 출력해야 합니다. 요구하는 내용이 상당히 복잡해 보입니다. 일단 차근 차근 해결해 봅시다.
먼저 teaches 테이블을 보겠습니다.
그러면, 교수 ID랑 course ID, 학기와 year가 있습니다. 먼저, 우리는 각 교수가 yy년 ss학기에 몇 개의 수업을 진행했는지 테이블에 나타내 보도록 하겠습니다. 기준이 3개이고, 나누어진 것에 대해서 count 함수를 적용하면 되겠습니다. 그러면, 교수 ID와 년도, 학기를 나누는 기준으로 써 주고, select 절에도 명시해 주면 됩니다.
그러면 이런 식으로 쿼리를 작성해 주시면 됩니다.
실행 결과는 다음과 같습니다. 이 테이블을 t라고 하겠습니다. t는 어떤 정보를 담고 있나요? 해당 교수가 yy학년도 ss학기에 몇 개의 수업을 강의했는지를 담고 있습니다. 그리고 이것을 결과 tb2라고 하겠습니다.
이제 yy년 ss학기에 한 교수가 가르친 수업 갯수가 최대인 것을 구해보겠습니다. t를 잘 보시면, ID가 year년 semester 학기에 가르친 수업 갯수를 담고 있다고 했습니다. 그러면, (yy,ss)를 그룹화 기준으로 삼은 다음에, 기준에 따라 나눠진 것을 어떻게 처리해야 하나요? cou가 최대인 것을 뽑아내야 합니다. 그래야 yy년 ss학기에 교수 1명이 최대로 가르친 수업 갯수가 나오기 때문입니다.
이는 위 쿼리로 처리할 수 있습니다.
실행 결과는 다음과 같습니다. 이를 결과 tb1이라 하겠습니다. 이제 이 둘을 적절히 Join을 해서 뽑아내는 것만 남았습니다. 하나는, yy학년도 ss학기에 한 교수가 가르친 수업의 최대치를 가지고 있고, 다른 하나는 yy학년도 ss에 id가 몇 개의 수업을 했는지 저장하고 있습니다.
그러면, 두 테이블에서 year, semester, cou값이 같은 것만 뽑아내면 될 거에요.
다음과 같이 작성할 수 있습니다. 만약에 tb1.cou = tb2.cou만 넣었다면 어떻게 될까요? 2006년에 1개의 수업만 한 교수도 결과에 들어갈 겁니다. 이는 문제에서 요구하는 바가 아님을 알 수 있습니다.
실행 결과는 위와 같습니다. 오늘 다중 속성으로 그룹화를 하는 것을 배웠고, 이것을 응용한 문제를 풀어보았습니다. 천천히 흐름을 따라가시다 보면 좋을 듯 싶습니다.
'코딩 > Sql' 카테고리의 다른 글
sql injection과 jdbc PreparedStatement (2) | 2020.06.02 |
---|---|
sql read committed vs repeatable read (0) | 2020.05.24 |
sql rollback commit 연산과 작업 단위 (2) | 2020.05.05 |
sql null 값이 왜 필요할까요? (0) | 2020.04.27 |
sql group by 응용 : 시험을 최소 1번 이상 통과한 사람을 고르라. (4) | 2020.04.18 |
최근댓글