[SQL] 프로그래머스 SQL 고득점 Kit IS NULL

상곤·2025년 5월 28일

SQL

목록 보기
4/5
post-thumbnail

프로그래머스 SQL 고득점 Kit GROUP BY

IS NULL 문제들은 Level 1, 2 밖에 없는 거 보면 전반적으로 쉬운가 보다

1. 경기도에 위치한 식품창고 목록 출력하기 Level 1

특별히 순서를 지켜서 작성할 만한 건 없었고,
자잘한 조건들이 많았다.

  1. 경기도에 위치한
    • 문제를 대충 읽어서 조건에 적지 않았다..
  2. 냉동시설 여부가 NULL인 경우, 'N'으로 출력
    • CASE WHEN ~ ELSE END 절
  3. 창고 ID를 기준으로 오름차순 정렬

제대로 다시 읽고 제출하니 바로 통과했다!

SELECT
    WAREHOUSE_ID,
    WAREHOUSE_NAME,
    ADDRESS,
    CASE
        WHEN FREEZER_YN IS NULL THEN 'N'
        ELSE FREEZER_YN
    END AS FREEZER_YN
FROM
    FOOD_WAREHOUSE
WHERE
    ADDRESS LIKE '경기도%'
ORDER BY
    WAREHOUSE_ID;

2. 이름이 없는 동물의 아이디 Level 1

쩝..

SELECT
    ANIMAL_ID
FROM
    ANIMAL_INS
WHERE
    NAME IS NULL;

3. 이름이 있는 동물의 아이디 Level 1

쩝쩝..

SELECT
    ANIMAL_ID
FROM
    ANIMAL_INS
WHERE
    NAME IS NOT NULL;

4. 나이 정보가 없는 회원 수 구하기 Level 1

쩝쩝쩝..

SELECT 
    COUNT(USER_ID) AS USERS
FROM
    USER_INFO
WHERE
    AGE IS NULL;

5. 잡은 물고기의 평균 길이 구하기 Level 1

드디어 문제다운 문제가 나왔다!

  1. 10cm 이하(NULL)는 10cm로 취급하는 조건
    • CASE WHEN 컬럼 THEN 값1 ELSE 값2 END
  2. 평균
    • AVG()
  3. 3째자리에서 반올림
    • ROUND(컬럼, 자리수)

3월 달에 있었던, SQLD 시험을 준비하며 한동안 SQL을 많이 풀었는데,,
그 후 다른 자격증들을 공부하며 한동안 잊고 지냈다..

그 덕에 이번 iM뱅크 코테에서 SQL 문제를 풀지 못 했다..

그 문제도 CASE WHEN 컬럼 THEN 값1 ELSE 값2 END을 사용했어야 하는데,
너무 오랜만이라서 기억이 안 났다..😥

그 문제만 풀었으면 3sol로 1차 면접으로 가는 거 였는데...😥
하반기에는 기필코 승리하리라..🔥🔥

SELECT
    ROUND(
        AVG(
            CASE
                WHEN LENGTH IS NULL THEN 10
                ELSE LENGTH
            END
        ),
        2
    ) AS AVERAGE_LENGTH
FROM
    FISH_INFO;

6. NULL 처리하기 Level 2

CASE WHEN THEN ELSE END절만 사용할 줄 알면 풀 수 있다!

SELECT
    ANIMAL_TYPE,
    CASE
        WHEN NAME IS NULL THEN "No name"
        ELSE NAME
    END AS NAME,
    SEX_UPON_INTAKE
FROM
    ANIMAL_INS;

7. ROOT 아이템 구하기 Level 2

1. 부모가 없는 ITEM_ID 구하기

SELECT
    *
FROM
    ITEM_TREE
WHERE
    PARENT_ITEM_ID IS NULL;

2. 위의 결과를 서브쿼리로 사용하여 부모가 없는 아이템 정보 출력하기

SELECT
    ITEM_ID,
    ITEM_NAME
FROM
    ITEM_INFO
WHERE
    ITEM_ID IN (
        SELECT
            ITEM_ID
        FROM
            ITEM_TREE
        WHERE
            PARENT_ITEM_ID IS NULL
    );

8. 업그레이드 할 수 없는 아이템 구하기 Level 3

'ITEM_A'->'ITEM_B'->'ITEM_C' 와 같이 업그레이드가 가능한 아이템이 있다면
'ITEM_C'의 PARENT 아이템은 'ITEM_B'
'ITEM_B'의 PARENT 아이템은 'ITEM_A'
ROOT 아이템은 'ITEM_A'가 됩니다.

1. PARENT_ITEM_ID 구하기

ITEM_TREE테이블을 출력해보면 이렇다.

PARENT_ITEM_ID는 null, 0, 1이다.

ITEM_ID 0은 1이나, 2로
ITEM_ID 1은 3이나, 4로
업그레이드가 가능한 것이다.

따라서 여기서 PARTENT_ID 컬럼의 0과 1을 제외한 ITEM_ID들은
모두 더 이상 업그레이드 불가능한 아이템들이다.

PARENT_ITEM_IDnull인 경우는 루트 아이템을 의미하는 것이기에 당연히 제외 대상이다.

SELECT
    DISTINCT PARENT_ITEM_ID
FROM
    ITEM_TREE
WHERE
    PARENT_ITEM_ID IS NOT NULL;

이 SQL문을 서브쿼리로 사용할 것이다!

2. 위의 결과를 서브쿼리로 사용하여 부모로 사용된 아이템 제외시키기

위 서브쿼리의 결과는 부모로 사용된 ITEM_ID들이다.

따라서 위 결과를 제외시킨다면 부모로 사용되지 않은 아이템들이다.
즉, 업그레이드가 가능한 ITEM_ID들이다!

WHERE절에 NOT IN 연산을 통해 서브쿼리에서 ITEM_ID를 제외시켜준다면,
업그레이드가 가능한 ITEM_ID들만 출력되는 것이다!

SELECT
    ITEM_ID,
    ITEM_NAME,
    RARITY
FROM
    ITEM_INFO
WHERE
    ITEM_ID NOT IN (
        SELECT DISTINCT
            PARENT_ITEM_ID
        FROM
            ITEM_TREE
        WHERE
            PARENT_ITEM_ID IS NOT NULL
    )
ORDER BY
    ITEM_ID DESC;
profile
🫠

0개의 댓글