티스토리 뷰
반응형
CREATE TABLE exercise_logs
(id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT,
minutes INTEGER,
calories INTEGER,
heart_rate INTEGER);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("biking", 30, 100, 110);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("biking", 10, 30, 105);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("dancing", 15, 200, 120);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("dancing", 15, 165, 120);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("tree climbing", 30, 70, 90);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("tree climbing", 25, 72, 80);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("rowing", 30, 70, 90);
INSERT INTO exercise_logs(type, minutes, calories, heart_rate) VALUES ("hiking", 60, 80, 85);
SELECT * FROM exercise_logs;
사람의 최대 심박수는 220-자신의 나이.
자기 심박수를 알아보자.
전체에서 넘어가는 행의 개수를 알고 싶으면?
SELECT COUNT(*) FROM exercise_logs WHERE heart_rate >220-30 ;
이제 심박수가 목표치에 들어가는지 보자.
50~90%
SELECT COUNT(*) FROM exercise_logs WHERE heart_rate > ROUND((220-30)*0.5)
AND heart_rate<ROUND((220-30)*0.9) ;
ROUND 함수를 추가한다.
알 수 있는 건 이 구간에 4개가 있다는 것.
각 심박 구간마다 보고 싶다면? GROUP BY를 이용해야 할 것 같지만, 그룹으로 묶을 열이 전혀 존재하지 않는다.
이 경우 CASE 구문을 사용하면 효과적으로 열을 생성할 수 있다.
이게 어렵긴 하다.
코딩의 if나 switch와 비슷하다.
일단 전체 열을 보자.
SELECT type,heart_rate FROM exercise_logs;
type heart_rate
biking 110
biking 105
dancing 120
dancing 120
tree climbing 90
tree climbing 80
rowing 90
hiking 85
그러면 어느 구간인지를 선택해야 하는데, SELECT 구간에 CASE를 적는다.
일단 심박수가 최대값 이상인지를 확인한다.
WHEN을 CASE와 같이 쓴다.
SELECT type, heart_rate,
CASE
WHEN heart_rate > 220-30
FROM exercise_logs;
THEN을 적고, 그냥 문자열 표현인 "above max"를 적어준다.
IF=WHEN, THEN이 출력.
ELSE는 말 그대로 ELSE고,
END로 case를 끝내준다.
SELECT type, heart_rate,
CASE
WHEN heart_rate > 220-30 THEN "above max"
WHEN heart_rate > ROUND(0.90 * (220-30)) THEN "above target"
WHEN heart_rate > ROUND(0.50 * (220-30)) THEN "within target"
ELSE "below target"
END as "hr_zone"
FROM exercise_logs;
그러면 hr_zone이라는 새로운 속이 생기고, 각 heart_rate을 구분할 수 있게 된다.
이렇게 생성된 새 열을 GROUP BY로 묶는다.
SELECT COUNT(*),
CASE
WHEN heart_rate > 220-30 THEN "above max"
WHEN heart_rate > ROUND(0.90 * (220-30)) THEN "above target"
WHEN heart_rate > ROUND(0.50 * (220-30)) THEN "within target"
ELSE "below target"
END as "hr_zone"
FROM exercise_logs
GROUP BY hr_zone;
그런 뒤에, type과 heart rate를 지우고 COUNT(*)을 넣어주면?
COUNT(*) hr_zone
4 below target
4 within target
이렇게 된다.
즉, hr_zone이라는 다른 테이블을 만들어서 묶어준 것이다.
반응형