-
[프로그래머스] 대장균들의 자식의 수 구하기 (MySQL)코딩테스트 준비/SQL 2024. 11. 4. 23:35
https://school.programmers.co.kr/learn/courses/30/lessons/299305
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해주세요. 자식이 없다면 자식의 수는 0으로 출력해주세요. 이때 결과는 개체의 ID 에 대해 오름차순 정렬해주세요.
ECOLI_DATA 테이블 예시 풀이1
- 대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력, 자식이 없다면 자식의 수는 0
- ECOLI_DATA 테이블을 보면 ID가 있고 해당하는 ID의 PARENT_ID가 있음을 볼 수 있다.
자신의 ID가 부모 ID인 칼럼의 갯수를 구하기 위해 SELF_JOIN을 해야함을 유추할 수 있고
ECOLI_DATA 테이블 두개를 A.ID = B.PARENT_ID로 LEFT JOIN를 한다.A(ECOLI_DATA)와 B(ECOLI_DATA)를 LEFT (OUTER) JOIN 시
A.ID != B.PARENT_ID에 해당하는 칼럼(=자식이 없는 ID)은 B테이블에서 NULL로 표시 - 결과를 보면 A.ID를 GROUP BY 하고, COUNT 함수를 사용하면 A.ID에 맞는 자식의 개수를 구할 수 있다.
다만, COUNT 함수를 B 테이블의 칼럼이 아닌 A 칼럼을 기준으로 사용할 경우 실제로 자식이 없는 칼럼도 갯수로 세기 때문에, B 테이블의 칼럼을 가지고 COUNT 함수를 사용해야한다.
- ECOLI_DATA 테이블을 보면 ID가 있고 해당하는 ID의 PARENT_ID가 있음을 볼 수 있다.
※ COUNT(*)는 NULL 값도 세고, COUNT(칼럼)은 칼럼값이 NULL이 아닌 개수를 구해준다.
- 개체의 ID 에 대해 오름차순 정렬
- ORDER BY ID 를 사용한다.
해당 조건들을 파악한 후 쿼리문을 짜면 다음과 같다.
SELECT A.ID, COUNT(B.ID) CHILD_COUNT FROM ECOLI_DATA A LEFT OUTER JOIN ECOLI_DATA B ON A.ID = B.PARENT_ID GROUP BY A.ID ORDER BY ID;
풀이2앞선 풀이와 동일하지만, COUNT(B.ID) 대신 SUM 함수와 IF 함수를 사용하여 다른 방식으로 구할 수도 있다.예를 들어, GROUP의 행마다 B.PARENT가 NULL인 경우에 0 값을 부여하고 그 이외의 값에는 1을 부여하고
그것의 SUM을 구하면 COUNT(B.ID)와 동일한 매커니즘으로 값을 구할 수 있다.SELECT A.ID, SUM(IF(B.PARENT_ID IS NULL, 0,1)) CHILD_COUNT -- IF(조건, 참이면 해당 값, 거짓이면 해당 값) FROM ECOLI_DATA A LEFT OUTER JOIN ECOLI_DATA B ON A.ID = B.PARENT_ID GROUP BY A.ID ORDER BY ID;
'코딩테스트 준비 > SQL' 카테고리의 다른 글
[프로그래머스] 업그레이드 된 아이템 구하기 Mysql (0) 2024.10.14 [프로그래머스] 오프라인/온라인 판매 데이터 통합하기 Oracle (1) 2024.10.09 [프로그래머스] 상위 n개 레코드 ORACLE SQL (0) 2024.10.07 [프로그래머스] 서울에 위치한 식당 목록 출력하기 ORACLE (4) 2024.10.06 [프로그래머스] 강원도에 위치한 생산공장 목록 출력하기 (2) 2024.10.06 - 대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력, 자식이 없다면 자식의 수는 0