CASE WHENCASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN conditionN THEN resultN
ELSE result
END;CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'E'
END;score가 94점인 경우, A에 해당한다.CASE
WHEN score >= 50 THEN 'E'
WHEN score >= 60 THEN 'D'
WHEN score >= 70 THEN 'C'
WHEN score >= 80 THEN 'B'
ELSE 'A'
END;score가 94점인 경우 E에 해당한다.IF(condition, value_if_true, value_if_false)IF(score >= 70, '통과', '과락')COUNTIF# 트레이너 별로 풀어준 포켓몬의 비율이 20%가 넘는 포켓몬 트레이너는 누구일까요?
SELECT
trainer_id,
SAFE_DIVIDE(
COUNTIF(status = 'Released'),
COUNT(*)
) AS released_ratio
FROM
basic.trainer_pokemon
GROUP BY
trainer_id
HAVING
released_ratio > 0.2;SUM(
IF(status = 'Released', 1, 0)
) AS released_cnt그동안 MySQL 환경에서 코딩테스트 문제를 풀 때 SEELCT절에서 사용하는 alias를 GROUP BY와 HAVING 절에서 자연스럽게 사용하고 있었는데 생각해보니 SQL 문법의 논리적 순서는 다음과 같았다.
1. FROM
2. WHERE
3. HAVING
4. GROUP BY
5. SELECT
따라서 WHERE에서 alias를 사용하면 오류가 난다!
하지만 왜 GROUP BY와 HAVING 절에서는 alias를 사용했을 때 오류가 안나는가?라는 의문이 들었다. 그래서 공식 문서를 찾아보았다.
The MySQL extension permits the use of an alias in the
HAVINGclause for the aggregated column:SELECT name, COUNT(name) AS c FROM orders GROUP BY name HAVING c = 1;
Standard SQL permits only column expressions in
GROUP BYclauses, so a statement such as this is invalid becauseFLOOR(value/100)is a noncolumn expression:SELECT id, FLOOR(value/100) FROM tbl_name GROUP BY id, FLOOR(value/100);
표준 SQL이라면 허용하지 않는 기능이지만, MySQL 등 다양한 환경에서 확장된 기능을 제공하는 것이었다! (Big Query도 마찬가지)
COUNT(*) vs COUNT(id)COUNT(*) COUNT(id)같은 SQL이라도 “왜 이 환경에서는 되는가”를 설명할 수 있어야 쿼리를 제대로 이해했다고 말할 수 있다는 것을 느꼈다.
CASE WHEN, IF를 활용한 조건부 집계 SQL 문제를 추가로 풀어본다.