[SQL] 20240213

김예지·2024년 2월 13일

SQL 풀이

목록 보기
15/26
post-thumbnail

*프로그래머스 SQL 문제 풀이입니다.


문제 1: 식품분류별 가장 비싼 식품의 정보 조회하기

📃 문제 1 링크

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

🔎 풀이 포인트

  • 조건: 식품분류별 가격이 제일 비싼 식품 조회
  • 정렬: 식품 가격 기준 내림차순
  • OUTPUT COLUMNS: 분류, 가격, 이름

제출 답안

SELECT CATEGORY, PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY) 
	AND CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC ;

문제 2: 년, 월, 성별별 상품 구매 회원 수 구하기

📃 문제 2 링크

USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

🔎 풀이 포인트

  • 조건: 년, 월, 성별별로 상품을 구매한 회원수 집계
  • 정렬: 년, 월, 성별 기준 오름차순
  • OUTPUT COLUMNS: 년, 월, 성별, 회원수(USERS)

제출 답안

SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, GENDER, COUNT(DISTINCT A.USER_ID) AS USERS
FROM USER_INFO A, ONLINE_SALE B
WHERE A.USER_ID = B.USER_ID AND GENDER IS NOT NULL
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
ORDER BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER ;

문제 3: 입양 시각 구하기(2)

📃 문제 3 링크

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

🔎 풀이 포인트

  • 조건: 각 시간대별로 입양이 몇 건이나 발생했는지 조회
  • 정렬: 시간 기준 오름차순
  • OUTPUT COLUMNS: 시간(HOUR), COUNT(입양 건 수)

제출 답안

WITH RECURSIVE H AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT 1+HOUR
    FROM H
    WHERE HOUR<23)
SELECT HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM H
LEFT JOIN ANIMAL_OUTS ON HOUR = HOUR(DATETIME)
GROUP BY HOUR
ORDER BY HOUR

(+) 계층 쿼리: WITH, WITH RECURSIVE

WITH

임시 테이블의 테이블명을 사용하여 값 참조 가능

WITH CTE AS (
	SELECT 0 AS NUM
    UNION ALL
   	SELECT 0 FROM SOME_TABLE
)

WITH RECURSIVE

가상 테이블을 생성, 자신의 값을 참조하여 결정
예: 0~10의 값을 갖는 임시 테이블 생성

WITH RECURSIVE H AS (
	SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM H
    WHERE HOUR < 10
profile
넓고 얕게? 좁고 깊게?

0개의 댓글