SQL 고득점 Kit - 8.25

김동현·2024년 8월 25일

SQL 고득점 Kit

목록 보기
39/56

GROUP BY - 가격대 별 상품 개수 구하기

문제

PRODUCT 테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.

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

1차 풀이

## price 매핑 후 그룹화해서 카운트
WITH pro AS (
    SELECT
        CASE 
            WHEN PRICE < 10000 THEN '0'
            WHEN (PRICE >= 10000) AND (PRICE < 20000) THEN '10000'
            WHEN (PRICE >= 20000) AND (PRICE < 30000) THEN '20000'
            WHEN (PRICE >= 30000) AND (PRICE < 40000) THEN '30000'
            WHEN (PRICE >= 40000) AND (PRICE < 50000) THEN '40000'
            WHEN (PRICE >= 50000) AND (PRICE < 60000) THEN '50000'
            WHEN (PRICE >= 60000) AND (PRICE < 70000) THEN '60000'
            WHEN (PRICE >= 70000) AND (PRICE < 80000) THEN '70000'
            ELSE '80000'
        END 'PRICE_GROUP'
    FROM PRODUCT
    GROUP BY PRICE
    ORDER BY PRICE
)

SELECT PRICE_GROUP, COUNT(PRICE_GROUP) PRODUCTS
FROM pro
GROUP BY PRICE_GROUP

2차 풀이

## price 매핑 후 그룹화해서 카운트
WITH pro AS (
    SELECT
        CASE 
            WHEN (PRICE >= 10000) AND (PRICE < 20000) THEN '10000'
            WHEN (PRICE >= 20000) AND (PRICE < 30000) THEN '20000'
            WHEN (PRICE >= 30000) AND (PRICE < 40000) THEN '30000'
            WHEN (PRICE >= 40000) AND (PRICE < 50000) THEN '40000'
            WHEN (PRICE >= 50000) AND (PRICE < 60000) THEN '50000'
            WHEN (PRICE >= 60000) AND (PRICE < 70000) THEN '60000'
            WHEN (PRICE >= 70000) AND (PRICE < 80000) THEN '70000'
            ELSE '80000'
        END 'PRICE_GROUP'
    FROM PRODUCT
    GROUP BY PRICE
)

SELECT PRICE_GROUP, COUNT(PRICE_GROUP) PRODUCTS
FROM pro
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

3차 풀이

## price 매핑 후 그룹화해서 카운트
WITH pro AS (
    SELECT
        CASE 
            WHEN (PRICE >= 10000) AND (PRICE < 20000) THEN '10000'
            WHEN (PRICE >= 20000) AND (PRICE < 30000) THEN '20000'
            WHEN (PRICE >= 30000) AND (PRICE < 40000) THEN '30000'
            WHEN (PRICE >= 40000) AND (PRICE < 50000) THEN '40000'
            WHEN (PRICE >= 50000) AND (PRICE < 60000) THEN '50000'
            WHEN (PRICE >= 60000) AND (PRICE < 70000) THEN '60000'
            WHEN (PRICE >= 70000) AND (PRICE < 80000) THEN '70000'
            ELSE '80000'
        END 'PRICE_GROUP'
    FROM PRODUCT
)

SELECT PRICE_GROUP, COUNT(PRICE_GROUP) PRODUCTS
FROM pro
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

4차 풀이

SELECT 
    (PRICE DIV 10000) * 10000 PRICE_GROUP, 
    COUNT(*) PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP

리뷰

  • 1차 2차까지 PRICE를 그룹화해서 매핑을 진행하여 동일한 가격대는 1개로 취급이 되어 틀렸다는 것을 알 수 있다.
  • 3차에서 매핑 부분에서 그룹화를 빼고 진행해서 맞췄다.
  • 하지만 이걸 여러 금액대를 다 사용한다고 생각하면 너무 번거롭고 코드도 너무 길다. 따라서 더 효율적인 코드를 작성한다.
  • 훨씬 간결하고 효율적인 코드가 완성되었다.

GROUP BY - 물고기 종류 별 잡은 수 구하기

문제

FISH_NAME_INFO에서 물고기의 종류 별 물고기의 이름과 잡은 수를 출력하는 SQL문을 작성해주세요.

물고기의 이름 컬럼명은 FISH_NAME, 잡은 수 컬럼명은 FISH_COUNT로 해주세요.
결과는 잡은 수 기준으로 내림차순 정렬해주세요.

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

풀이

SELECT 
    COUNT(fi.FISH_TYPE) FISH_COUNT, 
    fn.FISH_NAME
FROM FISH_INFO fi
INNER JOIN 
    FISH_NAME_INFO fn
ON 
    fi.FISH_TYPE = fn.FISH_TYPE
GROUP BY 
    fi.FISH_TYPE, fn.FISH_NAME
ORDER BY 
    FISH_COUNT DESC

리뷰

  • 그룹화를 TYPE과 NAME으로 설정해서 진행했다. (NAME으로만 그룹화를 해도 된다...)

String, Date - 연도 별 평균 미세먼지 농도 조회하기

문제

AIR_POLLUTION 테이블에서 수원 지역의 연도 별 평균 미세먼지 오염도와 평균 초미세먼지 오염도를 조회하는 SQL문을 작성해주세요. 이때, 평균 미세먼지 오염도와 평균 초미세먼지 오염도의 컬럼명은 각각 PM10, PM2.5로 해 주시고, 값은 소수 셋째 자리에서 반올림해주세요.
결과는 연도를 기준으로 오름차순 정렬해주세요.

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

1차 풀이

SELECT 
    YEAR(YM) 'YEAR',
    ROUND((SUM(PM_VAL1) / COUNT(*)), 3) 'PM10', -- 평균 미세먼지 오염도
    ROUND((SUM(PM_VAL2) / COUNT(*)), 3) 'PM2.5' -- 평균 초미세먼지 오염도
FROM AIR_POLLUTION
WHERE LOCATION2 = '수원' -- 수원 지역
GROUP BY YEAR
ORDER BY YEAR

2차 풀이

SELECT 
    YEAR(YM) 'YEAR',
    ROUND(AVG(PM_VAL1), 2) 'PM10', -- 평균 미세먼지 오염도
    ROUND(AVG(PM_VAL2), 2) 'PM2.5' -- 평균 초미세먼지 오염도
FROM AIR_POLLUTION
WHERE LOCATION2 = '수원' -- 수원 지역
GROUP BY YEAR
ORDER BY YEAR

리뷰

  • 소수점 반올림 자리수에 대해 계속 틀렸다.... 3이 3번째에서 반올림한다고 알고 있었는데 3번째 자리까지 나오게 하는 것으로 해석을 해야 된다. 즉, 첫 번째 자리에서 반올림해라 -> 그냥 ROUND만 사용하면 된다.
  • SUM 으로 직접 연산을 진행하다가 AVG라는 함수가 있는데 무식하게 계속 풀어서 계산했다..
  • 진짜 별것도 아닌 건데 숫자 하나로 오랫동안 못 풀고 있었던 것이 어이가 없다.

GitHub

가격대 별 상품 개수 구하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/131530.%E2%80%85%EA%B0%80%EA%B2%A9%EB%8C%80%E2%80%85%EB%B3%84%E2%80%85%EC%83%81%ED%92%88%E2%80%85%EA%B0%9C%EC%88%98%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

물고기 종류 별 잡은 수 구하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/293257.%E2%80%85%EB%AC%BC%EA%B3%A0%EA%B8%B0%E2%80%85%EC%A2%85%EB%A5%98%E2%80%85%EB%B3%84%E2%80%85%EC%9E%A1%EC%9D%80%E2%80%85%EC%88%98%E2%80%85%EA%B5%AC%ED%95%98%EA%B8%B0

연도 별 평균 미세먼지 농도 조회하기
https://github.com/lasentia/SQL_Study/tree/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/2/284530.%E2%80%85%EC%97%B0%EB%8F%84%E2%80%85%EB%B3%84%E2%80%85%ED%8F%89%EA%B7%A0%E2%80%85%EB%AF%B8%EC%84%B8%EB%A8%BC%EC%A7%80%E2%80%85%EB%86%8D%EB%8F%84%E2%80%85%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0

profile
'The best way to get started is to quit talking and begin doing.'

0개의 댓글