Mysql&DBeaver

DBeaver)MIN, MAX, AVG, SUM 집계함수로 통계내기

연습노트 2024. 9. 6. 13:09

card.csv
0.00MB

 

데이터 분석같은걸 잘하고 싶습니까

데이터 분석은 기본적으로 데이터에서 의미를 찾는 과정인데

의미같은걸 억지로 잘 만들어내면 분석 잘하는 것임 

가장 쉽게 의미찾는 법은 통계를 내는 겁니다.

합계, 평균, 최댓값 이런거 구해주면 됩니다. 

 

SQL에서 통계내는것도 되게 쉽게 할 수 있는데

SQL의 집계함수 (aggregate function) 를 사용하면 됩니다.

집계함수는 특정 컬럼의 합계, 평균, 최댓값 등 통계를 내주는 함수인데 엑셀함수랑 사용법이 비슷하고 쉬움 

 

 

 

 

 

 

 

그래서 오늘은 카드회사 취직했다고 가정하고 돈 많이쓰는 핵심 고객을 색출해봅시다. 

우선 새로운 card라는 이름의 테이블 하나 만들고 강의하단 csv 데이터를 card 테이블에 불러오면 됩니다. 

이번달의 고객별 카드 사용금액 테이블입니다. 

 

 

 

 

 

1. MAX() MIN() 으로 최대 최소 찾기 

 

현재 테이블에서 가장 돈 많이 쓴 사람을 찾아서 상을 줍시다. 

숫자가 들어있는 컬럼에서 최댓값을 찾고 싶으면 MAX() MIN() 함수 쓰면 됩니다. 

소괄호 붙어있는건 전부 함수라고 부릅니다. 

 

 

 

SELECT 사용금액 FROM card 

하면 사용금액 컬럼을 전부 출력할 수 있는데 

 

 

SELECT MAX(사용금액) FROM card 

MAX(컬럼명)을 쓰면 해당 컬럼의 최댓값이 들어있는 행만 출력해줍니다. 

 

 

SELECT MIN(사용금액) FROM card 

MIN(컬럼명)을 쓰면 해당 컬럼의 최솟값이 들어있는 행만 출력해줍니다. 

 

 

 

 

▲ 최고사용금액은 이렇다고 알려주는군요. 

 

 

 

 

 

2. 평균내려면 AVG()

 

SELECT AVG(연체횟수) FROM card 

컬럼에 있는 숫자들 평균내고 싶으면 AVG(컬럼명) 쓰면 됩니다. 

 

 

 

3. 합 구하려면 SUM()

 

SELECT SUM(사용금액) FROM card 

컬럼에 있는 숫자들 합을 내려면 SUM(컬럼명) 쓰면 됩니다. 

 

 

 

 

4. 행의 갯수를 세고 싶으면 COUNT() 함수

 

SELECT COUNT(사용금액) FROM card 

몇개의 행이 있는지 세고 싶으면 COUNT 쓰면 됩니다. 

숫자세주는 함수일 뿐이라 COUNT(*) 해도 결과는 같습니다.

 

아무튼 결론은 집계함수는 이게 끝입니다. 매우 쉬움 

그래서 응용사항을 몇개 알아봅시다. 

 

 

 

 

 

응용1. 컬럼명을 바꾸고 싶으면 AS

 

 

MAX(), MIN() 쓰면 컬럼명을 출력할 때도 MAX(어쩌구)가 뜹니다.

이게 싫으면 컬럼명을 다르게 치환해줘도 됩니다. 

 

 

 

 

SELECT MAX(사용금액) AS 최대사용금액 FROM card 

컬럼명 뒤에 AS 원하는단어 사용하면 됩니다.

그럼 컬럼명을 원하는 단어로 바꿔줍니다. 

 

 

▲ 진짜네요 

 

 

다른 단어로 치환하는걸 전문용어로 alias 라고 합니다. 

주의점은 AS 뒤에 작명할 때 실제 있는 컬럼명 말고 다른 단어를 작명하는게 좋습니다.

안그러면 컴퓨터가 헷갈린다고 뭐라그럴 수도 있음 

 

아무튼 쓰고싶을 때 쓰면 되는데

나중에 AS 문법을 꼭 필요로하는 곳들이 있으니 사용법은 잘 외워둡시다.

 

 

 

 

 

 

응용2. 당연히 필터링 후에 통계낼 수도 있음 

 

고객등급이 vip인 사람들만 뽑아서 통계를 내고 싶으면 어쩌죠?

그럼 당연히 vip인 사람만 필터링하고 통계내면 됩니다. 

예시로 "고객등급이 vip인 사람의 평균 사용금액"을 구해봅시다. 

쉬워보이면 알아서 짜봅시다. 

 

이건 답인데 바보들만 누릅니다

 

 

SELECT 사용금액 FROM card WHERE 고객등급 = 'vip' 

이러면 vip인 사람들의 사용금액만 필터링해서 출력해줍니다.

그리고 여기서 통계내면 되는거 아니겠습니까. 

 

 

SELECT AVG(사용금액) FROM card WHERE 고객등급 = 'vip' 

AVG 쓰면 평균내준다고 했습니다.

그래서 그거 써봤을 뿐입니다. 

 

[collapse]

 

 

그래서 "필터링한 결과에서 통계를 낼 수 있다" 이걸 잘 기억해둡시다.

나중에 실제 데이터 가지고 분석할 때도 중요한 점인데 

전체를 가지고 통계내는 것 보다

특정 그룹의 통계를 내는게 대부분 더 의미찾기가 쉽습니다.

결과가 입맛에 맞게 나올 때 까지 그룹의 범위를 맘대로 조작할 수 있으니까요. 

 

 

 

 

 

 

 

 

응용3. 참고로 DISTINCT도 사용가능합니다. 

 

컬럼을 출력할 때 왼쪽에 DISTINCT 키워드를 부착해줄 수 있는데

이러면 각 행에 있는 값들 중에 유니크한 값만 골라서 필터링해줍니다. 

쉽게말하면 중복데이터는 제거해서 보여달라는 뜻임 

 

 

SELECT DISTINCT 연체횟수 FROM card 

이러면 연체횟수 컬럼을 출력해주는데

중복된 값들은 전부 제거하고 출력해줍니다. 

 

 

 

SELECT AVG(DISTINCT 연체횟수) FROM card 

그리고 DISTINCT로 출력한 결과를 

MIN MAX AVG SUM COUNT로 통계낼 수도 있습니다. 

참고로 알아둡시다. 

 

 

 

 

오늘의 결론은 

SELECT MIN(컬럼명) / MAX(컬럼명) / COUNT(컬럼명) 등을 쓰면

 컬럼의 통계를 내주고 그 값을 그 자리에 남겨줍니다.

간단한 통계가 필요하면 사용합시다.  

 

 

 

 

 

(참고) MAX, MIN 대신 LIMIT 쓰는 경우도 있음

 

데이터가 너무 많거나 해서 일부 환경에선 MAX() 쓰는게 너무 오래걸릴 수도 있습니다. 

그러면 그냥 1. DESC순 정렬해서 2. 맨 위의 자료 하나만 뽑으면 됩니다.

그렇게 해도 MAX() 한거랑 똑같을듯 

 

 

SELECT MAX(사용금액) FROM card;
SELECT * FROM card ORDER BY 사용금액 DESC; 

그래서 이렇게 하나 저렇게 하나 최대금액은 결국 찾아낼 수 있습니다.

데이터가 많을 경우 테스트 해보고 더 빠른걸 씁시다. 

 

 

SELECT * FROM card ORDER BY 사용금액 DESC LIMIT 1; 

출력되는 행의 갯수를 제한을 두고 싶으면 맨 뒤에 LIMIT 행갯수 넣으면 됩니다.

Oracle은 LIMIT 말고 FETCH FIRST 행갯수 ROWS ONLY 이런거 넣어야함

 

그럼 이번엔 MIN() 쓰지 않고 최솟값을 출력하려면 어떻게 해야하죠?

잘 생각해봅시다. 

 

 

 

 

 

 

 

오늘의 숙제 :

Q1. 최대 결제횟수와 최소 결제횟수를 출력해봅시다. 

눈으로 흘깃하지말고 SQL 씁시다
SELECT MAX(결제횟수), MIN(결제횟수) FROM card 

SELECT 뒤에 컬럼 2개 이상 쓸 수 있는데유 

[collapse]

 

 

 

 

Q2. 고객등급이 vip인 사람들의 '평균 결제횟수'와

고객등급이 vip인 사람들의 '사용금액 총 합계'를 구해봅시다. 

SELECT AVG(결제횟수), SUM(사용금액) FROM card WHERE 고객등급 = 'vip' 

뭔가 어려우면 문제에서 '평균', '합' 이런 단어 빼고 먼저 짜보면 쉽습니다.   

아니면 원하는 데이터를 출력부터 하고 통계는 가장 마지막에 내보면 쉽습니다.  

[collapse]

 

 

 

Q3. 연체횟수가 1회 이하인 사람은 몇명일까요?  

님이 직접 하나하나 세지 말고 컴퓨터보고 출력해달라고 해봅시다.

SELECT COUNT(연체횟수) FROM card WHERE 연체횟수 <= 1