1. 집계함수(Aggregation Function)의 기본 개념 - sum, avg, min, max, count
2. 실전 문제 풀이 - Top Earners
1. 집계함수(Aggregation Function)의 기본 개념
집계 함수는 가장 간단하게 말해서 '어떠한 기준'을 가지고, 숫자들을 더하거나, 빼거나, 평균을 내거나 등등 간단한 사칙연산을 하는 함수입니다.
문법은 너무나도 간단해서 자세하게 설명하면 오히려 지루하고, 시간 낭비입니다. 그래서 참조할 만한 링크 하나 넣어드리고 이번 포스팅에서는 이 집계함수를 어떻게 실전 문제에서 활용하는지 말씀드리도록 할게요.
(1) 집계함수의 기본 문법 및 활용
blog.naver.com/february2ttl/80138225546
많은 블로그 중에서 이분이 가장 기본이 되면서 필요한 부분만 설명한 글인 것 같습니다. 여러분도 잘 참고해서 보시면 될 것 같아요.
(2) 집계함수의 활용 방법 - Group by (집계의 기준) having (집계에서 추가할 조건)
우리가 합을 구할 때 단순 총합을 구하는 경우는 없습니다. 예를 들어볼게요.
'영업 사원별로 이번 달 매출 실적을 분석해라'라는 업무가 떨어졌습니다. 그럼 단순 합이 아니라 '영업 사원'별로 이달의 '총 매출'을 확인해야 겠죠?? 이때 쓰이는게 Group by ~ having~입니다.
1) Group by 의 기본적인 문법
1
2
3
4
5
|
SELECT column-names
FROM table-name
WHERE condition
GROUP BY column-names
HAVING condition
|
cs |
이 순서를 항상 지켜주셔야 해요. 기본적으로 Group by 는 column들의 고유값을 묶어주기 때문에 어떠한 기준을 세울지 명확히 해야 합니다.
위의 예시에 적용한다면, 당옇니 '영업 사원'이 될 것 같습니다. 코드의 논리를 따라 손 코딩을 해본다면 이렇게 할 수 있겠죠.
<손 코딩 논리>
select 영업 사원이름
, sum(매출액)
from 매출 테이블
group by 영업 사원 이름
이런식으로 코드가 흘러간다는 의미이죠. 그래서 이 논리를 바로 문제에 적용을 해보도록 하겠습니다.
2. 실전 문제 풀이
우선 실전 문제는 Top Earners로 선정하였습니다. 자세한 링크를 보시고 싶으신 분은 아래의 URL 주소를 참고해주세요.
바로 본론으로 들어가서, (1) 문제 설명 및 요약, (2) 문제 풀이 접근, 그리고 (3) 실전 코드 설명 순으로 설명하도록 하겠습니다.
(1) 문제 설명 및 요약
우선 문제의 원본은 이렇습니다. 아래에 요약본이 있습니다. 걍 제끼세요. 영어는 제가 읽어드립니다.
We define an employee's total earnings to be their monthly salary * months worked, and the maximum total earnings to be the maximum total earnings for any employee in the Employee table. Write a query to find the maximum total earnings for all employees as well as the total number of employees who have maximum total earnings. Then print these values as space-separated integers.
Input Format
The Employee table containing employee data for a company is described as follows:
where employee_id is an employee's ID number, name is their name, months is the total number of months they've been working for the company, and salary is the their monthly salary.
Sample Input
Sample Output
69952 1
Explanation
The table and earnings data is depicted in the following diagram:
The maximum earnings value is . The only employee with earnings is Kimberly, so we print the maximum earnings value () and a count of the number of employees who have earned (which is ) as two space-separated values.
문제 요구 조건 요약
1. 총 수익 계산해라. 수식은 근속연수 * 월급이다.
2. 돈 제일 잘버는 애들의 수익이 얼마인지, 그리고 몇명인지 궁금하다.
3. 나머지 돈 못 버는 애들 볼 필요 없다 버려라.
네 그럼 바로 들어가보도록 하겠습니다.
<손코딩 논리 정리 >
select 수익 -> 수익은 별도의 column을 생성해주어야 할 것.
, 몇 명 -> 집계함수 중 count가 필요할 것.
from 서브쿼리 테이블 -> 위 두 column을 생성하기 위해서는 별도의 데이터 전처리 코드가 필요할 것.
limit 1;
위의 논리로 구성한 계획을 아래와 같이 표현할 수 있을 것 같습니다.
1
2
3
4
5
6
7
8
9
|
select t.earnings, t.tt
from (
select count(e.employee_id) tt
, e.months * e.salary earnings
from Employee e
group by e.months * e.salary
order by earnings desc
) as t
limit 1;
|
cs |
subquery단에서 수익을 계산하고, 그 수익별로 사람이 몇 명인지 계산하였습니다. 그러나 문제에서 요구하는 것은 오직 한명이었기 때문에 마지막 줄에서 limit를 통해 해결할 수 있습니다.
mysql이 oracle에 비해 떨어지는 부분이라 생각하는데, 동일한 작업을 oracle에서는 row_number()를 지정해주어 실행할 수도 있죠. 하지만 여기서는 다루지 않고 나중에 기회가 있을 때 비교하도록 하겠습니다.
그럼 여러분도 SQL 열심히 공부하시고, 절대 이 포스팅 끝까지 다 읽지 마시고 필요한 것만 알아서 골라서 입맛에 맞게 즐기다 가시길 바래요~~~
'SQL - Mysql & Oracle' 카테고리의 다른 글
[SQL] 프로그래머스 - 최댓값 구하기 해설(feat. 집계함수 모음) (0) | 2022.06.03 |
---|---|
SQL - 프로그래머스 - 입양 시각구하기(2) (0) | 2021.04.03 |
SQL - 실전 문제 풀이(Basic Join & Advanced Select) - 난이도 중 (0) | 2020.10.16 |
SQL - 실전 문제 풀이(Basic & Advanced Join) - 난이도 하 (0) | 2020.10.15 |