본문 바로가기

프로그래머스 풀이/Lv 3

[프로그래머스 SQL] 대장균들의 자식의 수 구하기

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/299305

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

어려워서 서칭해서 풀었다 ㅠ 

 

SQL은 조금만 쉬어도 감을 잃는듯하다.

 

하나의 테이블에서 새로운 값을 만들어 그 테이블을 조인해야하는데 처음 만난 유형이었다.

 

 

먼저 이 테이블에서

 

1 1

2 2

4 1

 

을 추출해보자. 위 셀렉트의 의미는 각 ID를 부모로 두고 있는 ID의 갯수이다. PARENT_ID를 그룹으로 묶으면 될 것이다. 그리고 HAVING 절로 NULL은 제외하자

 

SELECT 
        PARENT_ID, COUNT(*) AS C
    FROM 
        ECOLI_DATA
    GROUP BY 
        PARENT_ID
    HAVING 
        PARENT_ID IS NOT NULL

 

이제 위 테이블과 기존 테이블을 LEFT JOIN하자 조인컬럼은 ECOLI_DATA의 ID와 위 테이블의 PARANT_ID이다.

 

레프트조인하는 이유는 모든 ID가 표시되어야하기 때문이다. 그렇다면 자식이 없는 란의 C는 NULL이 될 것이므로 이것을 처리하는 함수를 써야한다. 사용 가능한 것은 세가지다.

 

1. CASE 문

CASE 
	WHEN B.C IS NULL THEN 0
    ELSE B.C
    END 
  AS CHILD_COUNT

 

2. COALESCE

이 함수는 가장 먼저 NULL이 아닌 값을 가져온다. 즉 B.C가 NULL이라면 0을 반환할 것이고 B.C가 NULL이 아니라면 B.C를 반환하게 될 것이다. 

COALESCE(B.C, 0)

 

3. IFNULL

이 함수는 B.C가 NULL이면 뒤의 값을 반환한다.

IFNULL(B.C, 0)

 

위 세개의 방법 중 아무거나 사용하면 되고 나는 케이스를 사용해봤다.

SELECT A.ID, CASE 
	WHEN B.C IS NULL THEN 0
    ELSE B.C
    END 
  	AS CHILD_COUNT 
    FROM ECOLI_DATA A
LEFT JOIN (
    SELECT 
        PARENT_ID, COUNT(*) AS C
    FROM 
        ECOLI_DATA
    GROUP BY 
        PARENT_ID
    HAVING 
        PARENT_ID IS NOT NULL
) B ON A.ID = B.PARENT_ID;