728x90
https://school.programmers.co.kr/learn/courses/30/lessons/299305
어려워서 서칭해서 풀었다 ㅠ
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;
'프로그래머스 풀이 > Lv 3' 카테고리의 다른 글
[프로그래머스 LV3] 불량 사용자 (C++) (0) | 2024.10.26 |
---|---|
[프로그래머스LV3] 등굣길 (C++) (0) | 2024.10.25 |
[프로그래머스LV3] 숫자 게임 (C++) (0) | 2024.10.24 |
[프로그래머스LV3] 단속카메라(C++) (3) | 2024.10.23 |
[프로그래머스LV3] 인사고과(C++) (0) | 2024.10.23 |