이번 포스팅은 GROUP BY의 '자르기'에 대해서 알아보겠습니다.
신상정보 테이블
자르기 예시
Persons(인물)
name | age | height | weight |
김과장 | 30 | 188 | 90 |
김대리 | 21 | 167 | 55 |
김주임 | 87 | 158 | 48 |
박사장 | 54 | 187 | 70 |
박이사 | 39 | 177 | 120 |
박팀장 | 90 | 175 | 48 |
화사 | 25 | 160 | 53 |
이효리 | 41 | 182 | 55 |
이상해 | 12 | 176 | 90 |
해당 테이블을 이름으로 자르면 다음과 같습니다.
SELECT substring(name,1,1) AS label
,COUNT(*)
FROM Persons
GROUP BY substring(name,1,1);
- 예시2
나이를 기준으로 어린이(20세 미만), 성인 (20~69세), 노인(70세 이상) 으로 파티션을 나누어 보겠습니다.
SELECT CASE WHEN age<20 THEN '어린이'
WHEN age between 20 and 69 THEN '성인'
WHEN age>69 THEN '노인'
ELSE NULL END AS age_class,
COUNT(*)
FROM Persons
GROUP BY CASE WHEN age<20 THEN '어린이'
WHEN age between 20 and 69 THEN '성인'
WHEN age>69 THEN '노인'
ELSE NULL END
실행 계획
- 예시3 (BMI 구하기)
BMI = w / t 제곱
키는 cm 단위가 아니고 m단위 입니다.
SELECT CASE WHEN weight / POWER(height / 100,2) < 18.5 THEN '저체중'
WHEN 18.5 <= weight / POWER(height / 100,2) AND weight / POWER(height / 100,2) <25 THEN '정상'
WHEN 25 <= weight / POWER(height / 100,2) THEN '과체중'
ELSE NULL END AS bmi,
COUNT(*)
FROM Persons
GROUP BY CASE WHEN weight / POWER(height / 100,2) < 18.5 THEN '저체중'
WHEN 18.5 <= weight / POWER(height / 100,2) AND weight / POWER(height / 100,2) <25 THEN '정상'
WHEN 25 <= weight / POWER(height / 100,2) THEN '과체중'
ELSE NULL END
GROUP BY 구에는 필드 이름만 적을 수 있다고 생각하는 사람들이 많은데요. 이렇게 복잡한 수식을 기준으로도 자를 수 있다는 것을
기억하시기 바랍니다.
'SQL' 카테고리의 다른 글
[SQL] 집약 (0) | 2020.09.02 |
---|---|
[SQL] 어쩔 수 없는 UNION (1) | 2020.09.01 |
[SQL] 조건 분기 CASE,UNION 차이 (0) | 2020.08.31 |
[SQL] SQL 조건 분기, 집합 연산, 윈도우 함수, 갱신 (0) | 2020.08.30 |
[SQL] DBMS 아키텍처 Part 2 (0) | 2020.08.29 |
댓글