📑 1. 문제설명

❌ 2. 실패한 시도
SELECT
CASE
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,7) IN ('01', '02', '03') THEN '1Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,7) IN ('04', '05', '06') THEN '2Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,7) IN ('07', '08', '09') THEN '3Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,7) IN ('10', '11', '12') THEN '4Q'
END AS QUARTER,
COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER;
처음에는 THEN 1 을 하고 CONCAT() 함수로 Q를 합치려고 했는데 그냥 1Q, 2Q, 3Q, 4Q 하면 됨
코드를 다 적고 나서 GROUP BY 절을 어떻게 써줘야 할지가 어려웠다.
틀린이유
작성한 코드의 실행결과에서 QUARTER에 null 값이 들어간 걸 보니 SUBSTRING 이 제대로 처리가 안 된 것 같다.

문제에서 기대하는 결과 화면▼

⭐ 3. 정답코드
SELECT
CASE
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,2) IN ('01', '02', '03') THEN '1Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,2) IN ('04', '05', '06') THEN '2Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,2) IN ('07', '08', '09') THEN '3Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6,2) IN ('10', '11', '12') THEN '4Q'
END AS QUARTER,
COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER;
잘못된부분
SUBSTRING(DIFFERENTIATION_DATE, 6,7)
수정한쿼리
SUBSTRING(DIFFERENTIATION_DATE, 6,2)
6번 인덱스에서 7번 인덱스까지 잘려내려고 했는데 6,7은 6번 인덱스 위치부터 7글자를 자르겠다는 뜻이다.
(6번 인덱스에서 7번 인덱스까지 자른다는 뜻이 아님 - 다른 프로그래밍 언어와 헷갈리지 말것)
SUBSTRING() 함수 사용법
SUBSTRING(string, start_position, length)- string: 문자열 또는 열 이름 (추출 대상)
- start_position: 추출을 시작할 위치 (1부터 시작)
- length: 추출할 문자의 길이
다른 방법으로 풀기
DATE_FORMAT()
SELECT CASE
WHEN DATE_FORMAT(DIFFERENTIATION_DATE,'%m') IN ('01', '02', '03') THEN '1Q'
WHEN DATE_FORMAT(DIFFERENTIATION_DATE,'%m') IN ('04', '05', '06') THEN '2Q'
WHEN DATE_FORMAT(DIFFERENTIATION_DATE,'%m') IN ('07', '08', '09') THEN '3Q'
WHEN DATE_FORMAT(DIFFERENTIATION_DATE,'%m') IN ('10', '11', '12') THEN '4Q'
END AS QUARTER,
COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER;🤔궁금한 점
"GROUP BY 절은 SELECT 절보다 먼저 수행되는데 어떻게 별칭사용이 가능한가?"
📌 SQL 쿼리 실행 순서

내가 GROUP BY 절에 별칭인 `QUARTER` 을 썼는데 코드가 프로그래머스 콘솔에서 돌아간다.
별칭을 부여한 SELECT 절이 GROUP BY 절보다 늦게 실행되는데 어떻게 ORDER BY 절에 별칭을 써도 코드가 돌아가는지 신기하다.
원래는 아래처럼 써야 하는거 아닌가?
SELECT
CASE
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('01', '02', '03') THEN '1Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('04', '05', '06') THEN '2Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('07', '08', '09') THEN '3Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('10', '11', '12') THEN '4Q'
ELSE 'UNKNOWN'
END AS QUARTER,
COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY
CASE
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('01', '02', '03') THEN '1Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('04', '05', '06') THEN '2Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('07', '08', '09') THEN '3Q'
WHEN SUBSTRING(DIFFERENTIATION_DATE, 6, 2) IN ('10', '11', '12') THEN '4Q'
ELSE 'UNKNOWN'
END
ORDER BY QUARTER;
검색 결과

'코딩테스트 > SQL테스트' 카테고리의 다른 글
| [프로그래머스] (MySQL) 연도 별 평균 미세먼지 농도 조회하기 (20) | 2025.01.21 |
|---|---|
| [프로그래머스] (MySQL) 카테고리 별 상품 개수 구하기 (6) | 2025.01.21 |
| [프로그래머스] (MySQL) 루시와 엘라 찾기, 한 해에 잡은 물고기 수 구하기 , DATETIME에서 DATE로 형 변환 (9) | 2025.01.21 |
| [프로그래머스] (MySQL) 조건에 맞는 사용자 정보 조회하기 (12) | 2025.01.20 |
| [프로그래머스] (MySQL) 대여 기록이 존재하는 자동차 리스트 구하기 (11) | 2025.01.19 |